Grails中字段级别的ACL

时间:2010-01-23 18:20:59

标签: grails permissions field acl

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

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

所以,问题是:如何使用Grails解决这个问题?

提前多多感谢,

问丹尼尔

4 个答案:

答案 0 :(得分:0)

Spring Security(Acegi插件)绝对是Grails的方式。

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如何创建这样的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对象与要保护的对象连接。