使用数据库在Rails中进行动态角色授权。声明授权的最佳选择?

时间:2010-08-23 09:10:22

标签: ruby-on-rails declarative-authorization

我需要提供动态角色分配(角色/权限)。更明确地说,最终用户应该能够创建角色,为新用户分配权限。所以我想在每个用户的表中存储角色和权限。

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我最近在一个项目中使用了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

答案 2 :(得分:1)

Cancan非常适合简单/启动项目,但如果你有一个单一的应用程序,你肯定应该包装它。康康应该是早期解决方案,但不是最终解决方案。如果您正在查看策略对象(专家),那么您可能需要构建自己的授权模型。像集成这样的授权会因客户而异,如果您正在寻找更具动态性的解决方案,或者您有太多的角色可言,那么cancan就不适合您。您可能需要更多数据驱动的安全模型。例如,如果您可以授予其他人访问实体的权限。