2012-01-06 79 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事情可能会更复杂(例如条件许可),但这也是一个拙劣的管理方式,所以我认为这应该足以满足大多数应用程序的需求。