능력 # 초기화 및 세션 변수 손실
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
정보가 부족하기 때문에 이 문제를 끝내겠습니다@만약 당신이 여전히 이 문제를 가지고 있다면 발표해 주십시오. 우리는 그것을 다시 열 것입니다.Reference
이 문제에 관하여(능력 # 초기화 및 세션 변수 손실), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/ryanb/cancan/issues/590텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)