2012-01-06 80 views
15

我需要在我的Rails應用程序中創建基於角色的權限系統。我會對CanCan非常滿意,但主要問題 - 必須是動態的,以便Admin必須能夠分配權限並創建新角色。權限可以是簡單的控制器/操作限制,也可以是與數據相關的,例如某些用戶只能編輯他們自己的配置文件,其中一些用戶可以編輯特定組中所有用戶的配置文件。如果允許管理員創建新的權限,這將非常好。Rails應用程序中的動態角色和權限系統

我在想的是在db中存儲一個控制器/動作,以及一些與數據相關的限制(我在這裏對於定義它們的方式非常困惑)。所以你可以給我一些建議,什麼是組織權限的最佳方式?

任何想法都是非常讚賞

回答

18

如果你喜歡CanCan,那麼我認爲最好使用它。以下是有關在數據庫中存儲使非程序員可以更新他們的能力一個簡短的教程:

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

如果你真的想自己實現這樣的系統。根據您的需求,我會建議您儘可能簡單地實施它。

如果您只需要用戶訪問模塊(某些控制器)。設置此領域時將是很好>http://apidock.com/rails/ActiveRecord/Base/serialize/class

class User 
    serialize :permissions, Array 

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

一些檢查 -

1)保存,就像序列化領域的所有用戶的權限:你可以做。

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給出的鏈接是比這更好的答案。]

你可以用慘慘做到這一點很容易。只需建立一個權限模型(其中has_and_belongs_to_many :users),並在您的Ability#initialize從模型中加載適合用戶的權限,並說用戶can可以完成這些權限。然後制定適當的用戶界面來管理該模型。

事情是這樣的:

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 

其中scope返回類似:allnil範圍,或Object.const_get(@scope_name)否則......與它玩。無論如何,這是可行的。

更復雜的CanCan事情可能會更復雜(例如條件許可),但這也是一個拙劣的管理方式,所以我認爲這應該足以滿足大多數應用程序的需求。