2

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

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

4

3 回答 3

1

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

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

Cancan is great for simple/starting projects but you should definitely wrap it if you have a monolithic app. Cancan should be a early solution but not a final one. If your looking at policy objects (pundit) it might be a code smell you need to build your own authorization model. Authorization like integration varies client to client and if your looking for more dynamic solutions or you have too many roles to speak of, cancan is not for you. You may need a more data-driven security model. For example if you can grant someone else access to an entity.

于 2014-12-29T02:39:10.187 回答