Rails应用程序中的动态角色和权限系统

16
我需要在我的Rails应用程序中创建基于角色的权限系统。我完全可以使用CanCan,但主要问题是它必须是动态的,因此管理员必须能够分配权限并创建新角色。权限可以是简单的控制器/操作限制,也可以是数据相关的,例如一些用户只能编辑自己的配置文件,而另一些用户可以编辑特定组中所有用户的配置文件。同时,允许管理员创建新的权限会非常好。
我考虑的是将控制器/操作和一些数据相关的限制存储在数据库中(我对定义方法感到困惑)。所以请给我一些建议,如何最好地组织权限?
非常感谢您的任何想法。
2个回答

23

如果你喜欢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

在设置此字段时进行一些检查会很好。

  1. 只需在每个控制器的顶部进行检查,看当前用户是否有访问该控制器(部分)的权限

    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
    end
    

    结尾

    管理员新闻控制器 需要访问权限 : 新闻 结束

当然,这只是一个起点,您可以从这里轻松发展。


CanCan 项目已经被废弃,新项目是 CanCanCan。教程链接为:https://github.com/CanCanCommunity/cancancan/wiki/Abilities-in-Database。 - Diego Somar
@DR.Somar是的,Cancan已经被放弃了。Pundit是更好的方法。我一直在为此编写自己的库,名为KittyPolicy - https://github.com/producthunt/kitty-policy - Radoslav Stankov

5

[编辑 @RadoslavStankov提供的链接比这个更好。]

你可以很容易地使用CanCan来完成它。只需为权限创建一个模型(其中has_and_belongs_to_many:users),并在你的Ability#initialize中从模型中加载适合用户的权限,并说用户可以执行它们。然后创建适当的用户界面来管理该模型。

类似于这样:

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

nil 范围返回类似于 :all 的内容时,或者否则返回 Object.const_get(@scope_name) ... 玩一下。无论如何,这是可行的。

更复杂的 CanCan 事物可能会更加复杂(傻瓜)-例如条件权限-但这也将是一个麻烦的管理问题,因此我认为这对于大多数应用程序来说应该足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接