我正在使用 Grails Spring-Security 插件 Spring-Security-Core-1.0.1(它又使用 spring-security-3.0.2.RELEASE)开发 Grails(版本 1.3.3)Web 应用程序。
我想在控制器内的操作上提供基于 Spring-Security 注释的访问控制。
我已经能够使用以下注释成功进行基本身份验证:
@Secured("hasAnyRole('ROLE_USER')")
def list = {
...
}
这有效 - 提供对list操作/视图仅适用于具有 ROLE_USER 角色的人员。
然而,允许执行某些控制器操作的角色集可能会随着时间的推移而改变,并且是系统整体状态的函数。也就是说,允许执行给定操作的角色集可能由服务或域对象方法返回。
我可能能够做这样的事情的一种方法是使用 Spring-Security 的“基于表达式的访问控制”(@Pre 和 @Post 注释),类似于Spring安全文档 http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#el-pre-post-annotations:
@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(Contact contact, Sid recipient, Permission permission);
在这个用于访问控制决策的示例中,可以使用#contact 语法来访问发送到该方法的对象(例如联系人)。
但是,我无法让 @PreAuthorize(或 @RolesAllowed)注释在 Grails 控制器操作上工作。如果我注释list使用@PreAuthorize(而不是@Secured,如上所述)进行操作,我收到以下错误:
注解
@org.springframework.security.access.prepost.PreAuthorize
元素 FIELD 上不允许
这并不奇怪——操作是一个 Groovy 闭包(具有可执行代码的字段),而不是一个方法。但是,我也尝试在方法上使用注释,从闭包调用,例如:
def list = {
testMethod()
....
}
@PreAuthorize("hasRole('ROLE_USER')")
public boolean testMethod(){
println "testMethod succeess"
return true;
}
虽然这不会引发任何错误,但它似乎也没有提供任何访问控制。 (无论用户是否具有 ROLE_USER,都会打印“testMethod success”)。
因此,我尝试了一些不同的方法(并阅读了文档),但未能找到一种在 Grails 控制器操作中使用 @PreAuthorize 注释的好方法。这可能吗? Grails 应用程序中是否有更好的方法来使用 Spring-Security-Annotations 来提供作为系统状态函数的访问控制?