능력 # 초기화 및 세션 변수 손실

3952 단어 cancan

묘사

저는 CanCan이 공개한 컨트롤러와 DSL을 매우 좋아하고 제 Rails 3.1.0과 Ruby 1.9.2-p290 응용 프로그램에 사용하기를 원합니다.비록 내가 상당히 표준적인 능력 초기화 방법을 가지고 있지만, 나는 관리자 역할이 모든 일을 할 수 있도록 허락하고, 현재 사용자가 정확한 공급업체가 있다면 다른 관련 자원을 선택적으로 부여할 수 있는 권한을 주려고 한다.방문하려는 공급업체 자원 id입니다.
내 리소스 컨트롤러는 다음과 같습니다.
class Vendor::VendorsController < Vendor::VendorBaseController
  load_and_authorize_resource
  before_filter(:ensure_user)

  private
  def ensure_user
    if current_user
        fb_perms_data = session[:storage_client].post('/me/permissions', nil, {:method => 'get'})
        fb_perms = fb_perms_data && fb_perms_data.length >= 1 ? fb_perms_data[0] : {}
        ...
 end
내 사용자 모델 클래스는 다음과 같이 정의됩니다.
class User < ActiveRecord::Base
  validates(:email, :presence=>:true)
  validates_format_of(:email, :with => /^\w+@\w+\.\w+/)
  validates_uniqueness_of(:email)

  has_many(:user_roles)
  has_many(:roles, :through => :user_roles)

  def role?(role)
    self.roles.include?(role)
  end
end
My Application Controller에는 다음과 같이 정의된 구조 프로세서가 있습니다.
class ApplicationController < ActionController::Base
  protect_from_forgery
  helper(:all)
  helper_method(:site_user, :current_user)

  private
  def current_user
    @current_user ||= session[:user]
  end

  def sessionize_user(user, storage_client=nil)
    session[:user] = user
    session[:storage_client] = storage_client
  end

  # CanCan authorization handling
  rescue_from CanCan::AccessDenied do |auth_exception|
    #flash[:error] = auth_exception.message
    # Todo route to user_root for consumer or vendor page depending on the user's primary role
    if !!current_user.vendor_id
      redirect_to(vendor_path(current_user.vendor_id))
    else
      redirect_to(consumer_path(current_user.id))
    end
  end
end
내 능력 수준은/models 디렉토리에 있으며 다음과 같이 정의됩니다.
class Ability
  include CanCan::Ability

  def initialize(user)
    # Allow anonymous/guest user participation
    user ||= User.new

    if user.role?(:admin)
      can(:manage, :all)
    else
      # Authorize based on non-admin roles
      can(:manage, Vendor) do |vendor|
        permitted = vendor.id === user.vendor_id
        permitted
      end
    end
  end
end
나는 이미 이 문제를 조정한 지 약 이틀이 되었는데, 약간의 도움이 필요하다.내가 예측 가능한 행위 권한을 얻는 유일한 방법은 User#role?(role) 방법의 모든 호출이true로 잘못 되돌아오는 것이다.만약 내가 이렇게 한다면 모든 사용자는 어떤 일을 하든지 목표를 파괴할 수 있다.
만약에 내가 정말로 User#role에서 예상한 대로 캐릭터를 검사했다면 Ability#initialize 방법을 처음 통과했을 때 공급업체 컨트롤러의 디스플레이 조작으로 인해 이 방법은 예상한 대로 작동했다. 왜냐하면 자원 컨트롤러의 권한 수여 검사에서 이상이 발생하지 않았기 때문이다.my action Vendors Controller가 실행될 때 before 필터가 있습니다. 정의는 다음과 같습니다.
  before_filter(:ensure_user)
나는 session[:user]session[:storage_client]의 세션 변수가 정확하게 초기화되었는지 확인할 수 있다.만약 내가 두 번째로 같은 조작을 실행한다면, 같은 루트와 파라미터에 대해 나의 조작은 실패할 것이다.비록 Ability#initialize 방법 블록이 예상대로 실행되었지만, session[:storage_client] 변수는 세션에서 사라졌다는 것을 알아차렸다.Before 필터가 이 변수에 어떤 조작을 요구하기 때문에 컨트롤러 조작이 실패할 수 있습니다.
좀 이상한 것은 사용자 대상이 보류되지 않았지만 다른 모든 내용은 삭제되었다는 것이다.나는 세션 컨트롤러의 한 방법에서만 세션 변수를 현저하게 리셋할 수 있고, 어떤 상황에서도 이 방법을 사용하지 않을 것이라고 이미 검사했다.로그아웃할 때만 발생하지만 실행되지 않습니다.
나는 정말 내가 끊겼다고 느낀다. 그래서 내가 이 문제를 해결하기 위해 무엇을 할 수 있는지에 대해 나는 매우 감사할 것이다.Rails 3.10 및 Ruby 1.9.2-p290이 Can 1.67에 적합합니까?만약 내가 그것을 일하게 할 수 없다면, 나는 내가 그것을 읽을 수 있도록 DA를 사용하거나 내 자신의Auth 모형을 조립하기로 결정해야만 할 것이다.

토론 #1

나는 너의 문제 보고서를 정리하기 위해 최선을 다했다.여기에는 많은 정보가 담겨 있다는 얘기다.분명히 많은 활동 부품이 있다.
CanCan을 간단한 응용 프로그램에서 정상적으로 실행해 본 적이 있습니까?쿵쿵x는 Rails 3.1 및 Ruby 1.9.2와 잘 어울린다.그게 문제가 아니야.
만약 당신이 여전히 도움을 필요로 한다면, 이 문제를 복제하기 위해github에 rails 프로그램을 발표할 수 있습니까?그럼 기꺼이 도와드리겠습니다.너는 어딘가에서 버그를 발견했지만, 몇 개의 파일의 몇 부분에서 찾았다고 말하기는 매우 어렵다.

토론 #2

정보가 부족하기 때문에 이 문제를 끝내겠습니다@만약 당신이 여전히 이 문제를 가지고 있다면 발표해 주십시오. 우리는 그것을 다시 열 것입니다.

좋은 웹페이지 즐겨찾기