在Grails中使用Spring之前/之后的安全性注释

在Grails中使用Spring之前/之后的安全性注释,grails,spring-security,Grails,Spring Security,我正在使用grailspring安全插件Spring-Security-Core-1.0.1(它反过来使用Spring-Security-3.0.2.RELEASE)开发一个Grails(版本1.3.3)Web应用程序 我想对控制器内的操作提供基于Spring安全注释的访问控制 我已经能够使用以下注释成功执行基本身份验证: @Secured("hasAnyRole('ROLE_USER')") def list = { ... } 这很有效-仅为具有角色\用户角色的用户提供对列表操作/视图

我正在使用grailspring安全插件Spring-Security-Core-1.0.1(它反过来使用Spring-Security-3.0.2.RELEASE)开发一个Grails(版本1.3.3)Web应用程序

我想对控制器内的操作提供基于Spring安全注释的访问控制

我已经能够使用以下注释成功执行基本身份验证:

@Secured("hasAnyRole('ROLE_USER')")
def list = {
...  
}
这很有效-仅为具有角色\用户角色的用户提供对列表操作/视图的访问

但是,允许执行某些控制器操作的角色集可能会随着时间的推移而变化,并且是系统整体状态的函数。也就是说,允许执行给定操作的角色集可能由服务或域对象方法返回

我可以这样做的一种方法是使用Spring Security的“基于表达式的访问控制”(@Pre和@Post annotations),例如:

在这个访问控制决策的示例中,可以使用#contact语法访问发送给方法(例如contact)的对象

但是,我无法让@PreAuthorize(或@RolesAllowed)注释在Grails控制器操作上工作。如果我用@PreAuthorize(而不是如上所述的@Secured)注释列表操作,我会得到以下错误:

注释 @org.springframework.security.access.prepost.PreAuthorize 不允许在元素字段上使用

这并不奇怪——操作是一个Groovy闭包(一个包含可执行代码的字段),而不是一个方法。但是,我也尝试在方法上使用从闭包调用的注释,如:

  def list = {
    testMethod()
    ....
  }

  @PreAuthorize("hasRole('ROLE_USER')")
  public boolean testMethod(){
    println "testMethod succeess"
    return true;
  }
虽然这不会引发任何错误,但似乎也没有提供任何访问控制。(“无论用户是否具有角色\用户,都会打印testMethod success”

因此,我尝试了一些不同的方法(并阅读了文档),但还没有找到一种将@PreAuthorize注释与Grails控制器操作结合使用的好方法。这可能吗?在Grails应用程序中,是否有更好的方法使用Spring安全注释来提供访问控制,这是系统状态的函数?

您需要使用注释来使用这些注释,但由于您指出的原因,它们无法用于控制器操作@之所以安全有效,是因为我创建了Spring安全性注释的副本,允许将其放置在字段、方法和类上,并且我查找它们并显式地将它们连接起来。您需要使用从控制器调用的带注释的服务

  def list = {
    testMethod()
    ....
  }

  @PreAuthorize("hasRole('ROLE_USER')")
  public boolean testMethod(){
    println "testMethod succeess"
    return true;
  }