【问题标题】:ACL on field level in GrailsGrails 中字段级别的 ACL
【发布时间】:2010-01-23 18:20:58
【问题描述】:

在我们的新软件项目中,我们有以下要求:一个网页应该显示一组数据。此数据应可由某些用户编辑(分配给角色,即经理),并且只能由其他用户查看。棘手的部分通过一个例子来描述:
用户页面由地址数据和帐户信息组成。地址数据由用户和管理员可编辑,所有用户均可查看,而账户信息只能由实际用户和管理员查看。

我已经阅读了很多关于 SpringSecurity 的信息。它提供了一个非常好的框架来授予对 url 和方法甚至域类的权限。但我需要的是字段级 ACL。至少,我现在是这么想的。

那么,问题是:如何使用 Grails 解决这个问题?

非常感谢,

问候丹尼尔

【问题讨论】:

    标签: grails permissions field acl


    【解决方案1】:

    Spring Security(Acegi 插件)绝对是 Grails 的最佳选择。

    您可以使用taglib,它允许页面因不同的角色而不同,例如:

    <g:ifUserHasRole roles="ROLE_ADMIN">
    html code for extra fields
    </g:ifUserHasRole>
    

    【讨论】:

    • 感谢您提供令人难以置信的快速答复。这个标签似乎很有帮助,因为可以通过使用它来实现有限的视图和适当的编辑功能。我想到的唯一缺点是:角色在 GSP 文件中是硬编码的,不是吗?你对这个问题也有一些巧妙的提示吗?
    • 在 Bootstrap.groovy 中,您通常有一些代码来定义角色和 .save(),但 GORM(使用 sql)实际上会创建一些数据库表,例如角色。
    • 再次感谢您的回答。关于安全性的一个问题:如果禁用查看或编辑属性,这并不意味着控制器“知道”这一事实并忽略请求中发送的某些数据。那么防止这种“攻击”的最佳做法是什么。此外,在我看来,我必须将角色映射硬编码到两个地方的属性:GSP 和控制器。有什么中心位置可以放吗?
    • 我认为 Spring Security 插件还没有 ACL 支持?
    • @kimble 是的,这不是 ACL,但基于角色的访问控制似乎是他想要的。
    【解决方案2】:

    我,我会在域类上对其进行编码,模仿 GORM 让您注释域类的方式(以static access = [field1: "ROLE_USER", field2: "ROLE_ADMIN,ROLE_USER"] 为例)。然后构建一个方法,您的控制器可以用来为给定用户编辑它们。该方法可以使用域类的注释来决定如何编辑它。然后,像插件一样将其元编程到每个域类上。

    类似地,编写相反的方法来限制参数的数据绑定到域类中,编写自己的数据绑定实用程序方法,然后将其元编程到每个域类中。

    然后你可以使用instance.redact(user)instance.bindData(params, user) 来做你想做的事,它实际上是声明式语法。

    【讨论】:

      【解决方案3】:

      我们有类似的情况,并使用 gsp 中的 ifUserHasRole 标记来驱动适当的表示,并且我们有一个过滤器,它根据被调用的操作强制执行规则。例如,在用户控制器上,我们只允许管理角色调用保存操作,或者如果 user.id 与 session.user.id 相同。这似乎是适合我们情况的最佳选择。

      【讨论】:

        【解决方案4】:

        如何创建这样的 ACL 类:

        class ACL(val entry: Entry*) {
          def isAccessAllowed(subject: String, permission: String): Boolean = ...
        }
        
        class Entry(val subject: String, val permission: String*)
        

        用法:

        new ACL(
          new Entry("dave", "read", "write"), 
          new Entry("linda", "read")
        )
        

        (这个例子是在 Scala 中,因为我发现它在这种情况下更具表现力,但应该很容易将它转移到 Groovy。)

        然后,您可以将 ACL 对象与要保护的对象连接起来。

        【讨论】:

          猜你喜欢
          • 2012-09-03
          • 1970-01-01
          • 2014-11-21
          • 2013-11-07
          • 2016-02-25
          • 2020-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多