我浏览了一大堆不同的授权和 ACL 插件,和你一样,我不喜欢大多数人使用的 CRUD 方法。
最后,最适合我的是类似于 Redmine 使用的设置。我不知道它是否来自任何命名的插件,但我花了一些时间来理解它并为我的案例进行了必要的调整。
基本上,它的作用是允许使用控制器和操作,无论是全局的还是特定模型的。您首先指定可分配哪些不同的权限:
MyApplication::ACL.mapper do |map|
map.permission :view_project, {:projects => :show}
map.permission :manage_project, {:projects => [:update, :edit, :post_status]}
map.permission :delete_project, {:projects => :destroy}
end
下一步是为角色分配一个或多个权限,该角色是具有可以存储权限的序列化字段的模型,即:
<#Role id: 1 name: "Intern" permissions: [:view_project] >
<#Role id: 2 name: "Member" permissions [:view_project, :manage_project] >
然后您通过会员模型将不同的角色与用户映射。成员资格也可以映射到特定模型,例如项目,因为您可能被允许管理一个项目但不能管理另一个项目,或者它可以是全局的,如一些应该限制但您不知道要授权哪个模型的索引操作反对呢。
在控制器中,您可以使用以下方法验证所有这些:
before_filter :authorize, :only => [:show, :update, :edit,
:post_status, :destroy]
而authorize当然是一种检查当前用户是否是具有当前Controller和Action所需权限的任何角色的成员的方法。
虽然这里的描述很长,但只是简单地说它是如何工作的 :) 它比其他 ACL 插件复杂得多,但我认为它是最“干净”的替代方案,同时仍然允许我需要的灵活性.