我正在使用Grails Spring-Security插件Spring-Security-Core-1.0.1开发Grails(1.3.3版)Web应用程序(它反过来,使用spring-security-3.0.2.RELEASE)。使用Grails前/后Spring安全注解
我想为控制器中的操作提供基于Spring-Security注解的访问控制。
我已经能够使用下面的注解成功地做到基本身份验证:
@Secured("hasAnyRole('ROLE_USER')")
def list = {
...
}
这工作 - 提供访问列表动作/视图,只有那些与ROLE_USER作用。
但是,允许哪些角色执行某些控制器操作的集合可能随时间而改变,并且是系统总体状态的函数。也就是说,允许执行给定操作的角色集合可以由服务或域对象方法返回。
的一种方式,我也许可以做这样的事情,这将是使用Spring-Security的“基于表达式的访问控制”(@Pre和@Post注释),类似的例子在Spring Security Documentation:
@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(Contact contact, Sid recipient, Permission permission);
在这个访问控制决策示例中,可以使用#contact语法访问发送到方法(例如联系人)的对象。
但是,我无法获得@PreAuthorize(或@RolesAllowed)注释来处理Grails控制器操作。如果我用注释@PreAuthorize(而不是@Secured,如上)的列表行动,我得到以下错误:
Annotation @org.springframework.security.access.prepost.PreAuthorize is not allowed on element FIELD
这并不奇怪 - 动作是一个Groovy闭包(场与可执行代码),而不是一种方法。
def list = {
testMethod()
....
}
@PreAuthorize("hasRole('ROLE_USER')")
public boolean testMethod(){
println "testMethod succeess"
return true;
}
虽然这不会引发任何错误,也没有出现提供任何访问控制:不过,我也使用方法上的注解,从封闭叫,喜欢尝试。 (无论用户是否具有ROLE_USER,都会打印“testMethod成功”)。因此,我尝试了几个不同的东西(并阅读文档),但一直未能找到一个使用@PreAuthorize批注和Grails控制器操作的好方法。这可能吗?在Grails应用程序中使用Spring-Security-Annotations提供访问控制是一种更好的方式,而访问控制是系统状态的一个功能?