【问题标题】:Dynamic roles and permissions system in Rails appRails 应用程序中的动态角色和权限系统
【发布时间】:2012-02-04 03:05:20
【问题描述】:

我需要在我的 Rails 应用程序中创建基于角色的权限系统。我会对 CanCan 感到非常满意,但主要问题是 - 它必须是动态的,因此管理员必须能够分配权限并创建新角色。权限可以是简单的控制器/操作限制,并且可以是数据相关的,例如一些用户只能编辑他们自己的配置文件,而其中一些可以编辑特定组中所有用户的配置文件。如果允许管理员创建新权限,那就太好了。

我正在考虑的是在 db 中存储一个控制器/动作,以及一些与数据相关的限制(我在这里真的很困惑如何定义它们)。那么您能否给我一些建议,组织权限的最佳方式是什么?

任何想法都非常感谢

【问题讨论】:

    标签: ruby-on-rails ruby roles


    【解决方案1】:

    如果你喜欢CanCan,那么我认为最好使用它。这是一个关于在数据库中存储能力以便非程序员可以更新它们的简短教程:

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

    如果你真的,真的想自己实现这样的系统。根据您的需要,我会建议您尽可能简单地实现它。

    如果您只需要用户可以访问模块(某些控制器)。你可以这样做:

    1. 将所有用户权限存储在序列化字段中 -> http://apidock.com/rails/ActiveRecord/Base/serialize/class

      类用户 序列化:权限,数组

      def access_to?(模块) 权限.包括?模块.to_s 结尾 结束

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

    1. 如果当前用户有权访问此控制器(部分),只需检查每个控制器的顶部

      类 ApplicationController 私人的

      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
      

      结束

      类 AdminNewsController require_access_to :新闻 结束

    当然这只是一个起点,你可以从这里轻松进化。

    【讨论】:

    【解决方案2】:

    [EDIT@RadoslavStankov 给出的链接比这更好。]

    您可以使用 CanCan 轻松完成。只需为权限创建一个模型(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
    

    其中scopenil 范围返回了类似:all 的内容,或者Object.const_get(@scope_name) 否则......玩它。无论如何,这是可行的。

    更复杂的 CanCan 事情可能更复杂(呃) - 例如条件权限 - 但管理起来也很麻烦,所以我认为这对于大多数应用程序来说应该足够了。

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 2021-09-16
      • 2020-03-17
      • 2018-09-16
      • 2023-03-07
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多