2010-08-18 78 views
5

我正在使用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提供访问控制是一种更好的方式,而访问控制是系统状态的一个功能?

回答

5

您需要使用ACL plugin来使用这些注释,但由于您指出的原因,它们不适用于控制器操作。 @Secured的工作原理是我创建了一个Spring Security注解的副本,它允许将它放在字段以及方法和类上,我会查找它们并明确地将它们连接起来。您需要使用您从控制器调用的带注释的服务。