2011-05-03 3 views
2

레일 프로젝트의 권한에 대해 선언적 권한 부여 젬을 사용하고 있으며 사용자 권한에 따라 모델의 출력을 제한하려고합니다.declarative_authorization을 사용하여 모델의 결과 제한

내 백성 모델에서
roles do 
    role :supervisor 
    has_permission_on :people, :to => :manage_all 
    end 

    role :basic_user 
    has_permission_on :people, :to => :manage_subordinates 
    end 
end 

privileges do 
    privilege :manage_subordinates do 
    includes :subordinate_records 
    end 

    privilege :manage_all do 
    includes :all_records 
    end 
end 

, 나는 지원이처럼 보이는이

def self.supervised_by(user) 
    if user.permitted_to? :all_records 
    #return all of the records 
    elsif user.permitted_to? :subordinate_records 
    #return some of the records 
    else 
    #return none of the records 
    end 
end 

같이 할 정적 방법이 있습니다

내 축약 된 인증 파일은 다음과 같다 with_permissions_to 또는 permitted_to를 사용하여 설명서에서 AuthorizationInModel 객체를 사용합니다. 필자는 설명서를 기반으로 이러한 기능을 사용하는 방법이나 현재 모델에 대한 현재 사용자의 권한 목록을 반환하는 방법을 파악하지 못했습니다.

아이디어가 있으십니까?

답변

1

if-attribute 메소드가 내장 된 대체 솔루션을 발견했습니다. 원래 네임 스페이스가없는 모델과 네임 스페이스로 된 컨트롤러와 뷰를 사용했기 때문에 원래는 그 모델에서 벗어났습니다. 이 구조는 제가 작업중인 프로젝트의 원본 버전 인 아티팩트 형태입니다. 대부분의 작업은이 구조를 처리하기위한 선언적인 승인을 얻고 있습니다.

나에게 명확하지 않은 주요 정보는 부분적으로 이름이 지정된 환경에서 사용 권한의 이름을 지정하는 방법이었습니다. 이 모델은 모델 이름 (: people)을 예상했으며 컨트롤러는 네임 스페이스와 모델 (: staff_people)을 예상 했으므로 뷰를 선택하는 한 뷰는 상관 관계가 없었습니다. 내가 선택한 해결책은 모델 이름을 사용하고 모든 컨트롤러에서 컨텍스트를 명시 적으로 설정하는 것이 었습니다. 컨텍스트가 컨트롤러에 설정되어 있지 않은 경우 filter_access_to를 사용하면 올바른 권한보다는 staff_people 권한을 찾고 있기 때문에 작동하지 않습니다.

선언적 승인 구성 파일에서 관리자에게 부분 권한을 부여하고 전체 권한을 부여합니다. person.supervised는 자신과 다른 모든 감시 대상자의 배열을 반환합니다.

roles do 
    role :administrator 
    has_permission_on :people, :to => [:create, :read, :update, :delete] 
    end 

    role :supervisor 
    has_permission_on :people do 
     to => [:create, :read, :update, :delete] 
     if_attribute :id => is_in { Person.find_by_user_id(user.id).supervised } 
    end 
    end 
end 

이름 공간 컨트롤러에서이 정보에 액세스하려면 filer_resource_access를 사용하고 있습니다.

module Staff 
    class PeopleController < ApplicationController 
    filter_resource_access :context => :people 

    def index 
     @people = People.with_permissions_to(:read) 
    end 

나는

filter_access_to :all, :with_attribute => true 

를 사용하여 with_permissions_to과 if_attribute 권한을 사용해야하는 방법을 작동하지 않은 것을 발견했다. 왜 이것이 문제 였는지 확신 할 수 없다.

단일 레코드를 인수의 일부로 가져 오는 ID를 포함하지 않는 비표준 컨트롤러 작업에는 filter_access_to를 사용해야합니다.part_timers라는 행동이 사람들의 목록을 반환하는 경우 예를 들어,이 솔루션은 작동해야처럼 보인다 :

filter_resource_access :context => :people, :additional_member => { :part_timers => :read } 

올바른 해결책은 그대로 filter_resource_access을 유지하고 해당 작업

filter_resource_access :context => :people 
fitler_access_to :part_timers, :required => :read, :context => people 
에 대한 filter_access_to을 추가하는 것입니다
0

이렇게하는 것이 더 좋은 방법 일 수 있지만 다른 모든 것이 올바르게 설정되어 있다면 supervised_by 방법에 대해 작동합니다.

def self.supervised_by(user) 
    if Person.new.permitted_to? :all_records, :user=>user 
    #return all of the records 
    elsif Person.new.permitted_to? :subordinate_records, :user=>user 
    #return some of the records 
    else 
    #return none of the records 
    end 
end