代码之家  ›  专栏  ›  技术社区  ›  2snacc

Rails ACL设计问题

  •  0
  • 2snacc  · 技术社区  · 15 年前

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

    我正在研究 declarative_authorization 但是还没有确定它是否可以做任何事情,除了基于对象的权限。

    这一定是web应用程序的一个相当常见的用例,我不希望再滚动另一个ACL。有人对第三方图书馆有什么建议吗?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Zabba fl00r    15 年前

    我想 CanCan 可以帮助你。它使用简单,应该做你所需要的。这是一个铁路公司: Authorization with CanCan

        2
  •  2
  •   DanneManne    15 年前

    我浏览了大量不同的授权和ACL插件,像你一样,我不喜欢他们大多数人使用的CRUD方法。

    最后,最适合我的是一个类似于雷德明使用的设置。我不知道它是否源于任何命名插件,但我花了一些时间来了解它,并为我的情况做了必要的调整。

    基本上,它所做的是允许使用控制器和操作,无论是全局的还是特定的模型。首先要指定可分配的不同权限:

    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] >
    

    然后通过一个成员模型将不同的角色映射到用户。成员资格还可以与特定的模型(如Project)进行映射,因为您可能被允许管理一个项目,而不是另一个项目,或者它可以是全局的,就像某些应该受到限制的索引操作,但您还不知道要针对哪个模型进行授权。

    在控制器中,您可以使用以下方法验证所有这些:

      before_filter :authorize, :only => [:show, :update, :edit,
                                          :post_status, :destroy]
    

    当然,authorize是一种检查当前用户是否是具有当前控制器和操作所需权限的任何角色的成员的方法。

    虽然这是一个很长的描述,但它的工作原理是:)它比其他的ACL插件复杂得多,但我认为它是最干净的替代,同时仍然允许我需要的灵活性。