2012-01-06 10 views
15

Railsアプリケーションで役割ベースの権限システムを作成する必要があります。私はCanCanに全く満足しているだろうが、主な問題は - 動的でなければならないため、管理者は権限を割り当てて新しい役割を作成できる必要がある。パーミッションは単純なコントローラ/アクションの制限があり、データに関連する可能性があります。たとえば、一部のユーザーは自分のプロファイルのみを編集でき、一部は特定のグループのすべてのユーザーのプロファイルを編集できます。管理者が新しい権限を作成できるようにするのは本当にうれしいことです。Railsアプリケーションの動的役割と権限システム

私が考えているのは、dbにコントローラ/アクションといくつかのデータに関連する制限を保存することです(私は実際にそれらを定義する方法についてここで混乱しています)。だから、あなたに私に助言をしてもらえますか?パーミッションを整理する最善の方法は何でしょうか?

任意の考えは非常に

答えて

18

CanCanが好きなら、それを使用するのが最善だと思います。あなたは本当に、本当にこのようなシステムを自分で実装する場合

https://github.com/ryanb/cancan/wiki/Abilities-in-Database

:ここではとても非プログラマはそれらを更新することができ、データベース内の能力を格納についての短いチュートリアルです。あなたのニーズに応じて、できるだけ簡単に実装することをお勧めします。

ユーザのみがモジュール(特定のコントローラ)にアクセスする必要がある場合。あなたは行うことができます。

1)は、単にシリアル化されたフィールドのように、すべてのユーザーの権限を保存 - >http://apidock.com/rails/ActiveRecord/Base/serialize/class

class User 
    serialize :permissions, Array 

    def access_to?(module) 
    permissions.include? module.to_s 
    end 
end 

いくつかのチェックをいいだろう、このフィールドを設定するとき。

2)現在のユーザーが、このコントローラ(セクションへのアクセス権を持っている場合だけで、これはあなたが簡単に進化させることができ、そこから、ちょうど開始位置である)もちろん

class ApplicationController 
    private 

    def self.require_access_to(module) 
     before_filter do |c| 
     unless c.send(:current_user).try :access_to?(module) 
      c.send :render_no_presmissions_page 
     end 
     end 
    endposible 
end 

class AdminNewsController 
    require_access_to :news 
end 

をすべてのコントローラの上のチェックを行います。

5

評価されている[@RadoslavStankovによって与えられたリンクが、これよりも良い答えですEDITを。]

あなたは簡単にカンカンでそれを行うことができます。アクセス許可(has_and_belongs_to_many :users)のモデルを作成して、Ability#initializeにユーザーの適切なアクセス許可をモデルから読み込んで、ユーザーcanを実行するだけです。次に、そのモデルを管理するための適切なユーザーインターフェイスを作成します。このような

何か:scopeがそうでなければ...それで遊ぶnilスコープの:all、またはObject.const_get(@scope_name)のようなものを返さ

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    user.permissions.each do |permission| 
     can permission.symbol, permission.scope 
    end 
    user.prohibitions.each do |permission| 
     cannot permission.symbol, permission.scope 
    end 
    end 
end 

。とにかく、それは実行可能です。

もっと複雑なCanCanのものは、より複雑なもの(例えば、条件付きのアクセス許可)である可能性がありますが、これは管理者にとっても邪魔になるので、ほとんどのアプリケーションでは十分であると思います。

関連する問題