2011-03-22 3 views
3

상속 된 리소스와 결합 된 CanCan의 모델 중첩 된 3 단계의 문제가 있습니다. 나는 우리가 둥지 모두 최대 2 개 수준으로해야 읽었습니다,하지만 난 account 모델에서 모든 것을 넣어했고 지금은 캉캉에서이 일을 시도했습니다 나에게있다 @account 변수를 제공상속 된 리소스 및 CanCan 3 단계 중첩

load_and_authorize_resource :account 
load_and_authorize_resource :project, :through => :account 
load_and_authorize_resource :model, :through => :project 

을 값을 덮어 쓰는 것처럼 @project의 값. @project는 있어야하고 @model입니다. CanCan, Inherited Resources 또는 CanCan이 3 단계 중첩을 지원하지 않습니다. 또한, 나는 ModelsController를 위해 IR에서 이것을한다. 내가 캉캉의 정의에서 부분 load_and_를 제거 할 때

belongs_to :account, :finder => :find_by_name! do 
    belongs_to :project, :finder => :find_by_name! 
end 

또 다른 이상한 것은

이다. 그것은 그 때 작동합니다, 그러나 나는 load 부분을 사용하지 않는 것이 위험 할 수 있다는 것을 읽었습니다.

authorize_resource 만 사용할 수 있습니까? 아니면 CanCan을 사용해야합니까?

+2

CanCan을 통해 얼마나 많은 레벨이 지원되는지 알 수는 없지만, 자신 만의 로딩을 한 후 대신'authorize_resource' 메소드 만 호출 할 수 있습니다. https://github.com/ryanb/cancan/wiki/Authorizing-Controller-Actions – jdl

+0

authorize_resource를 사용하려면 authorize_resource 전에로드하기 전에 before_filter를 사용해야합니다. – dombesz

답변

2

귀하의 승인 내용은 정확합니다.

라이언이 작동 방법을 게시 캉캉 보석의 개발자 : https://github.com/ryanb/cancan/issues/127#issuecomment-364475

당신의

load_and_authorize_resource :account 
load_and_authorize_resource :project, :through => :account 
load_and_authorize_resource :model, :through => :project 

여기 (같은 블록에 종료됩니다 것을 의미 :. 액션을 만들 다른 작업을 위해 마지막은) 권한을 부여하고 @model 변화해야합니다!

@account = Account.find(params[:account_id]) 
authorize! :read, @account 
@project = @account.projects.find(params[:project_id]) 
authorize! :read, @project 
@model = @project.models.build 
authorize! :new, @model 

나는이 대답이 중첩 된 캉캉 인증을 찾고 개발자에게 도움이 될 수 있기를 바랍니다 :-).

소스 : https://github.com/ryanb/cancan/issues/127#issuecomment-364475


PS : 잘못된 동작은/새/1/프로젝트/2/모델/계정 :

load_and_authorize_resource :project 
load_and_authorize_resource :model, :through => :project 

이 보안 문제의 종류를이 때문에 이렇게

@project = Project.find (PARAMS [: PROJECT_ID]) [...]

,

이고 현재 계정이 연결된 계정 '1'을 읽을 수 있는지 확인하지 않습니다. 그리고 '2'프로젝트가 실제로 '1'계정의 프로젝트인지 확인하지 않습니다.