在我们的新软件项目中,我们有以下要求:网页应显示一组数据。某些用户(分配给角色,即经理)可以编辑此数据,并且只能由其他用户查看。棘手的部分由一个例子描述:
用户页面由地址数据和帐户信息组成。用户和管理员可以编辑地址数据,并且所有用户都可以查看,而帐户信息只能由实际用户和经理查看。
我已经阅读了很多关于SpringSecurity的信息。它为URL和方法甚至域类的gran权限提供了一个非常好的框架。但我需要的是字段级ACL。至少,这就是我现在的想法。
所以,问题是:如何使用Grails解决这个问题?
提前多多感谢,
问丹尼尔
答案 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对象与要保护的对象连接。