【问题标题】:Dynamic Role Authorization in Rails using a database. Declarative Authorization the best choice?Rails 中使用数据库的动态角色授权。声明式授权的最佳选择?
【发布时间】:2011-04-02 13:06:09
【问题描述】:

我需要提供动态角色分配(角色/权限)。更清楚地说,最终用户应该能够创建角色,将权限分配给新用户。所以我正在考虑将每个用户的角色和权限存储在一个表中。

有没有一种聪明的方法来做到这一点(任何其他插件?),或者我应该编写代码来使用声明式授权来做到这一点。一些光线会有所帮助。谢谢!

【问题讨论】:

    标签: ruby-on-rails declarative-authorization


    【解决方案1】:

    尝试回答这些以更接近解决方案:

    1. 角色本身是动态的吗?即管理员可以通过网络界面更改分配给角色的各种权限吗?如果是,那么您应该将此信息存储到您的数据库中。对于像博客这样的系统,其中角色是预先定义的,例如。管理员、访客和版主,声明式授权就像一个魅力。
    2. 权限与 UI 的耦合有多强? (有时它只是您需要限制的几个地方,在其他情况下,例如社交网络,权限要复杂得多,并且与 UI 紧密耦合)。如果它的耦合非常紧密,即所有类型的角色都可以使用一个操作,但这些角色执行的操作受其定义的限制,那么声明式授权(或类似的)将无济于事,您需要一个遗留系统。李>

    【讨论】:

    • 我知道这真的很老了,但你能用遗留系统扩展你的意思吗?
    • 通过遗留系统我的意思是特定于 OP 正在构建的平台的代码库或规则集。例如在我们的其中一款产品中,DispatchManagerAccountContactSalesExecutive 在应用程序的不同部分都具有不同的权限和角色。所以我为此建立的规则系统将被称为遗留系统。
    【解决方案2】:

    我最近在一个项目中使用了CanCan,觉得它很酷。您创建一个 Ability 类并使用它来决定用户是否“可以”执行该操作...您可以检查方法中的表中是否存在权限,或者他们的规则集是否允许该操作。

    我从 github 自述文件中获取了所有这些示例代码:

    class Ability
      include CanCan::Ability
    
      def initialize(user)
        if user.admin?
          can :manage, :all
        else
          can :read, :all
        end
      end
    end
    

    然后在您的视图和控制器中,您可以检查授权级别

    <% if can? :update, @article %>
      <%= link_to "Edit", edit_article_path(@article) %>
    <% end %>
    
    
    def show
      @article = Article.find(params[:id])
      authorize! :read, @article
    end
    

    【讨论】:

      【解决方案3】:

      Cancan 非常适合简单/启动项目,但如果您有一个单体应用程序,则绝对应该将其打包。 Cancan 应该是一个早期的解决方案,但不是最终的解决方案。如果您查看策略对象(权威人士),则可能是代码味道,您需要构建自己的授权模型。诸如集成之类的授权因客户而异,如果您正在寻找更动态的解决方案或者您有太多角色可言,那么 cancan 不适合您。您可能需要更多数据驱动的安全模型。例如,如果您可以授予其他人访问实体的权限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 2017-09-10
        • 2017-12-01
        • 2011-01-27
        相关资源
        最近更新 更多