【发布时间】:2011-04-02 13:06:09
【问题描述】:
我需要提供动态角色分配(角色/权限)。更清楚地说,最终用户应该能够创建角色,将权限分配给新用户。所以我正在考虑将每个用户的角色和权限存储在一个表中。
有没有一种聪明的方法来做到这一点(任何其他插件?),或者我应该编写代码来使用声明式授权来做到这一点。一些光线会有所帮助。谢谢!
【问题讨论】:
标签: ruby-on-rails declarative-authorization
我需要提供动态角色分配(角色/权限)。更清楚地说,最终用户应该能够创建角色,将权限分配给新用户。所以我正在考虑将每个用户的角色和权限存储在一个表中。
有没有一种聪明的方法来做到这一点(任何其他插件?),或者我应该编写代码来使用声明式授权来做到这一点。一些光线会有所帮助。谢谢!
【问题讨论】:
标签: ruby-on-rails declarative-authorization
尝试回答这些以更接近解决方案:
【讨论】:
DispatchManager、AccountContact 和 SalesExecutive 在应用程序的不同部分都具有不同的权限和角色。所以我为此建立的规则系统将被称为遗留系统。
我最近在一个项目中使用了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
【讨论】:
Cancan 非常适合简单/启动项目,但如果您有一个单体应用程序,则绝对应该将其打包。 Cancan 应该是一个早期的解决方案,但不是最终的解决方案。如果您查看策略对象(权威人士),则可能是代码味道,您需要构建自己的授权模型。诸如集成之类的授权因客户而异,如果您正在寻找更动态的解决方案或者您有太多角色可言,那么 cancan 不适合您。您可能需要更多数据驱动的安全模型。例如,如果您可以授予其他人访问实体的权限。
【讨论】: