【问题标题】:Rails ACL Design QuestionRails ACL 设计问题
【发布时间】:2010-11-19 01:03:15
【问题描述】:

我正在处理遗留的 Rails 代码库,需要实现一些 ACL 逻辑,这些逻辑不是基于对对象的标准 CRUD 操作,而是围绕关于向不同用户组显示页面的哪些部分的自定义逻辑。这些页面“部分”不是由数据库中的任何对象定义的,所以我猜基于对象的 ACL 系统可能不是最适合这里的。

我目前正在研究declarative_authorization,但尚未确定它是否可以做除基于对象的权限之外的任何事情。

这一定是 Web 应用程序的一个相当常见的用例,我不想再推出另一个 ACL。有没有人建议一个可以很好地解决这个问题的第三方库?

【问题讨论】:

标签: ruby-on-rails acl


【解决方案1】:

我认为CanCan 可以帮助您。它使用简单,应该可以满足您的需求。这是 RailsCast:Authorization with CanCan

【讨论】:

  • 在试用了 CanCan 之后,我发现您不必只拘泥于 CRUD 权限。您可以在任何模型或nil 对象上声明自定义权限。
【解决方案2】:

我浏览了一大堆不同的授权和 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 插件复杂得多,但我认为它是最“干净”的替代方案,同时仍然允许我需要的灵活性.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2011-10-07
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    相关资源
    最近更新 更多