깊이 끼워 넣은 자원이 권한이 부여되지 않은 이상을 일으키다
3812 단어 cancan
묘사
이렇게 많은 배우와 이 플러그인에 감사합니다, 라이언!하지만, 나는 한 가지 문제가 있다. 나는 너의 도움으로 해결되기를 바란다.나는 문서의 지침에 따라 이 일을 했지만, 일은 내가 예상한 대로 진행되지 않았다.최신 버전의 CanCan 및 Rails 2.3.8을 사용하고 있습니다.
나는 세 가지 모델이 있는데 그것이 바로 사용자, 프로젝트와 임무이다.
클래스 사용자
끝맺다
class Project < ActiveRecord::Base
belongs_to :user
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :project
end
내 노선 중에는 다음과 같은 몇 가지가 있다.지도 1에셋:사용자,:많은 =>:항목
지도 1자원:항목,:많은 =>:tasks,:속=>:user
지도 1에셋:작업:속=>:프로젝트
내 디렉터에서 다음을 수행합니다.
클래스 UsersController
끝맺다
class ProjectsController < ApplicationController
load_and_authorize_resource :user
load_and_authorize_resource :project, :through => :user
end
class TasksController < ApplicationController
load_and_authorize_resource :project
load_and_authorize_resource :task, :through => :project
end
내 능력 과정에 다음과 같은 몇 가지가 있다.학급 능력
CanCan 포함: 기능
def initialize(user)
can :read, :all
can :manage, User, :id => user.id
can :manage, Project, :user_id => user.id
can :manage, Task, :project => { :user_id => user.id }
end
end
만약 내가 id=1의 사용자와 id=3의 항목과 함께 로그인한다면.이거 되게 좋아요.
/사용자/
/사용자/편집
/사용자/1,: 메서드=> 삭제
이것 또한
/사용자/프로젝트
/사용자/프로젝트/신규
/사용자/프로젝트/3/편집
/users/1/projects/3,:method=>“delete”
하면, 만약, 만약...
/프로젝트/작업/신규
나는 권한을 부여받지 않은 이상을 던졌다.
저도 제 노선에서 이렇게 해볼게요.
map.resources :users do |user|
user.resources :projects do |project|
project.resources :tasks
end
end
이것은 나에게 이런 노선을 주었다/사용자/프로젝트/작업
/사용자/1/projects/3/tasks/:id
/사용자/프로젝트/작업/신규
/사용자/1/projects/3/tasks/:id/edit
제 미션 컨트롤러에 이걸 사용해요.
클래스TasksController
리소스 로드 및 권한 부여:프로젝트,:통과=>: 사용자
리소스 로드 및 승인:작업,:통과=>:프로젝트
끝맺다
하지만 나도 위와 같은 노선을 사용할 수 있는 권한이 부여되지 않았다.내가 뭘 잘못했는지, 아니면 CanCan이 이런 깊이 끼워 넣은 자원 권한을 제공하지 않았는지?
토론 #1
액세스new
작업 시에만 또는 다른 Tasks Controller 작업 시에만 무단 예외가 발생합니까?첫 번째 경우, before 필터는 new
동작으로 이 동작을 수행합니다.@ 항목 = 항목.찾기(매개변수 [:project id])
권한 부여!:보기: @project
@task=@project.임무.짓다
권한 부여!:새 작업 @task
임무는 프로젝트를 통해 구축된 것이기 때문에
user_id
의 요구를 충족시키고 성공을 거두어야 한다.너의 두 번째 예에서, 그것은 바로 이렇게 한 것이다.@ 사용자 = 사용자.찾기(매개변수 [:user id])
권한 부여!:읽기, @user
@project=@user.프로젝트찾기(매개변수 [:project id])
권한 부여!:보기: @project
@task=@project.임무.짓다
권한 부여!:새 작업 @task
이론적으로 말하자면, 이것도 마땅히 통할 수 있어야 한다.첫 번째 장면으로 돌아가서 컨트롤러를 이걸로 바꿔 보세요.
클래스TasksController
filter: 작업을 로드하기 전에:only=>:new
리소스 로드 및 승인:작업,:통과=>:프로젝트
프라이빗
def load 퀘스트
@task=@project.임무.구축(: 프로젝트=>@프로젝트)
끝맺다
끝맺다
new
작업이 이 상황에서 유효한지 확인합니다.토론 #2
또한 콘솔 또는 테스트 키트에서 직접Ability
실험을 수행하여 올바른 동작을 확인하고자 할 수도 있습니다.# 콘솔에서
사용자 = 사용자찾기(1)
항목 = 사용자입니다.프로젝트찾기(3)
작업 = 프로젝트임무.짓다
능력신규(사용자)
능력할 수 있다읽기, 사용자
능력할 수 있다읽기, 항목
능력할 수 있다새로운 임무
컨트롤러는 기본적으로 이렇게 한다.
토론 #셋
라이언, 난 기분이 안 좋아. 나 자신을 때리고 싶어.이 플러그인은 너무 좋아요. 효과가 아주 좋아요.이 서류들도 매우 좋은 문서 기록이 있어 매우 뚜렷하다.깊이 있는 삽입 자원에 대한 내용을 추가하지 않았지만, 나는 여전히 이 점을 해냈다.나의 코드는 딱 맞지만 효과가 없다.원흉은 사용자 모델과 연결된 프로젝트 모델의 외부 키가 문자열로 설정된 것이다.나는 네가 답장을 한 후에 컨트롤러 테스트를 할 때 비로소 이 점을 발견했다.
나 지금 나 때문에 부끄러워...어쨌든 관심 가져주셔서 감사합니다!
토론 #4
걱정하지 마세요. 문제를 발견하게 되어 기쁩니다.Reference
이 문제에 관하여(깊이 끼워 넣은 자원이 권한이 부여되지 않은 이상을 일으키다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/ryanb/cancan/issues/127텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)