2

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

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

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

非常感谢提前,

问候丹尼尔

4

4 回答 4

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 对象与要保护的对象连接起来。

于 2010-02-05T16:00:50.357 回答
0

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

于 2010-02-05T14:24:49.510 回答
0

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

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

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

于 2010-01-23T19:52:24.640 回答
0

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

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

<g:ifUserHasRole roles="ROLE_ADMIN">
html code for extra fields
</g:ifUserHasRole>
于 2010-01-23T18:29:58.993 回答