2010-04-19 2 views
3

이미 존재하는 다소 큰 앱에 권한을 추가하려고하지만 세부 사항을 조금씩 이해해야합니다. 대략 다음과 같이, 우리는 계층 적 숫자 나 역할이 우리의 응용 프로그램에서역할에 대한 선언적 권한 부여

: 여기

는 배경의 각 사용자 모델 인스턴스의 역할을 '속성을 가지고 허가를 들어

BasicUser -> SuperUser -> Admin -> SuperAdmin 

위와 일치합니다.

Backoffice에서 이름 공간을 가진 RESTful 컨트롤러 "사용자"가 있습니다. 즉 Backoffice :: UsersController입니다.

우리는 사용자가 사용자가 사용자를 편집 할 수 있지만,이 '작은'역할을 할 경우에만 그들이 현재 가지고보다에 대한 권한을 부여 할 수 있도록하려면 :

class Backoffice::UsersController < ApplicationController 
    filter_access_to :all 
    #... RESTful actions + some others 
end 

그래서 여기 문제입니다. 나는 authorization_rules.rb

authorization do 
    role :basic_user do 
    has_permission_on :backoffice_users, :to => :index 
    end 
    role :super_user do 
    includes :basic_user 
    has_permission_on :backoffice_users, :to => :edit do 
     if_attribute :role => is_in { %w(basic_user) } 
    end 
    end 
    role :admin do 
    includes :super_user 
    end 
    role :super_admin do 
    includes :admin 
    end 
end 

에 다음 불행히도 그것은 지금까지 내가 가진대로의 규칙이 적용 얻을하지 않는 것 만들었습니다. 내가 규칙을 주석 처리하면 나는 또한 if_attribute에 변화의 몇 가지를 시도했습니다 모두

편집 할 수있는 규칙을두면

  1. , 아무도
  2. 을 편집 할 수 없습니다 :

    if_attribute :role => is { 'basic_user' } 
    if_attribute :role => 'basic_user' 
    

    과 같은 효과가 있습니다. 누구 제안이 있습니까?

답변

0

나는 내 응용 프로그램에서 다음과 같은 접근 방식을 가지고 있고 그것은 당신이 지금이 문제를 해결 확신

role :super_user do 
    includes :basic_user 
    has_permission_on :backoffice_users do 
     to :edit 
     if_attribute :role => is {"basic_user"} 
    end 
end 
4

작동하지만, 우리는 단지 비슷한 문제를 가지고 어떤이 될 수있는 해결책에 명중 도움. 순전히 선언적 승인 DSL에서 사례를 처리하는 것은 불가능할 수도 있지만 DSL을 활용하여 모델 및 뷰에서 올바른 작업을 수행 할 수 있습니다. 기본적으로 역할 계층 구조 그래프에 액세스해야했습니다.

단서는 declarative_authorization이 역할의 계층 구조를 나타내는 그래프를 생성하는 멋진 컨트롤러를 가지고 있다는 것입니다.

class Role < ActiveRecord::Base 
    require 'declarative_authorization/development_support/analyzer' 

    has_many :assignments 
    has_many :users, :through => :assignments 

    validates :name, :presence => true 
    validates :name, :uniqueness => true 

    def ancestors 
    Authorization::DevelopmentSupport::AnalyzerEngine::Role.for_sym(self.name.to_sym, 
     Authorization::Engine.instance).ancestors.map { |r| r.instance_variable_get("@role") } 
    end 

    def self_and_ancestors 
    ancestors << self.name.to_sym 
    end 
end 

당신 만 동일하거나 열등 사용자 편집기에서 역할 선택을 제공하는 등의 작업을 수행하려면이 옵션을 사용할 수 있습니다 : 그들은이 같은 지원 코드를 사용하면 쉽게 thusly 히 어떤 역할의 조상에 액세스 할 수 있습니다 current_user의 역할과 액세스를 거부하거나 사용자를 부적절하게 승격시키려는 누군가에게 모델의 변경을 허용하지 않습니다. 선언적 권한 부여 DSL 자체의 컨텍스트에서 유용하지는 않습니다. 먼저 구문 분석되어 일종의 순환 참조를 생성해야하기 때문입니다.

희망을 통해 도움이 필요한 사람을 도와줍니다.