2012-01-18 6 views
7

私はdeclarative_authorization、CanCan、CanTangoを見てきました。彼らはすべてアプリケーションに権限を追加するのは良いですが、私はモデルの特定のインスタンスに権限を追加する、つまりある人が1つのプロジェクトで管理アクセス権を持ち、限られたものしか管理できないのかどうか疑問に思っていました。別のRails 3.1での承認:CanCan、CanTango、declarative_authorization?

もっと良い方法を教えてください。私の質問があまりにも些細なように聞こえたら謝ります。私がRoRを初めて使ったからかもしれない。

おかげで、私はカンカンとdeclarative_authorizationを知っている、と私は両方で、役割ベースの権限を実装したよう ジョン

+0

CanCanでは、条件付きブロックを介して能力を定義できます - https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks。 –

+0

1. TeamMembersには多くのユーザー、ロールがあります 2.チームには多数のTeamMembersがあります 3.チームにはチームが1人あります... 上記の設定では、プロジェクトの特定のインスタンスをフィルタリングする手段はありません。あなたはそれができると思うなら...あなたは私に、前もって感謝します。 –

答えて

4

は、私はカンカンをお勧めします。ちょうど私の2セント。

(未テスト、残念ながら私はここでテストすることはできませんし、私は自分のコードにアクセス全くない)

それでは、私たちはこのような構造を持っているとしましょう:

class User < ActiveRecord::Base 
    belongs_to :role 
end 

class Role < ActiveRecord::Base 
    has_many :users 

    # attributes: project_read, project_create, project_update 
end 

その後、カンカンが見ることができます

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    @user = user 
    @role = user.role 

    # user can see a project if he has project_read => true in his role 
    can :read, Project if role.project_read? 

    # same, but with create 
    can :create, Project if role.project_create? 

    # can do everything with projects if he is an admin 
    can :manage, Project if user.admin? 
    end 

end 

必要な情報はすべて、githubのCanCan wikiで見つけることができます。個人的な勧告は読むために:

は、基本的にはあなたは自分の関係を通して、あなたの役割が含まれるように上記の例を拡張する必要があります。簡単にするために、ability.rbに追加のヘルパーメソッドを作成することもできます。あなたは(少なくとも私は)のために落ちることがあり

メイン平均警告:あなたはどのようなユーザーことはできませんを定義する前がモデルで何かを行うことができ、ユーザーを確認してください。さもなければ、あなたは挫折して座って、「なぜ?私は決してユーザーを書くことはできませんでした」と思うでしょう。うん。しかし、あなたはまた、明示的に...彼ができることを書いたことはありません

+0

私はcancan ..を実装しましたが、特定のインスタンス(例えばプロジェクト)のユーザを定義/制限する方法を理解することはできません。任意の本当に役立つでしょう。 ユーザーとプロジェクトの間に間接的な接続があります... 1. TeamMembersには多くのユーザーがいます 2.チームには多数のTeamMembersがあります 3.プロジェクトにはチーム –

+0

が1つ更新されています。 – pduersteler

+0

cancanをインストールしてロールモデルを作成する必要がありますか?私はcancanのドキュメントにそれが必要であるとは見ません。これを説明してもらえますか?ありがとう –

0
class User < ActiveRecord::Base 

    belongs_to :role 
    delegate :permissions, :to => :role 

    def method_missing(method_id, *args) 
    if match = matches_dynamic_role_check?(method_id) 
     tokenize_roles(match.captures.first).each do |check| 
     return true if role.name.downcase == check 
     end 
     return false 
    elsif match = matches_dynamic_perm_check?(method_id) 
     return true if permissions.find_by_name(match.captures.first) 
    else 
     super 
    end 
    end 


    private 

    def matches_dynamic_perm_check?(method_id) 
    /^can_([a-zA-Z]\w*)\?$/.match(method_id.to_s) 
    end 

    def matches_dynamic_role_check?(method_id) 
    /^is_an?_([a-zA-Z]\w*)\?$/.match(method_id.to_s) 
    end 

    def tokenize_roles(string_to_split) 
    string_to_split.split(/_or_/) 
    end 

end 

使用法:

user.is_an?管理者

user.can_delete?