我正在使用 Grails Spring-Security 插件 Spring-Security-Core-1.0.1(反过来,使用 spring-security-3.0.2.RELEASE)开发 Grails(版本 1.3.3)Web 应用程序。

我想为 Controller 内的操作提供基于 Spring-Security 注释的访问控制。

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

@Secured("hasAnyRole('ROLE_USER')") 
def list = { 
...   
} 

这有效 - 仅向具有 ROLE_USER 角色的人提供对列表操作/ View 的访问权限。

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

我可能能够做这样的事情的一种方法是使用 Spring-Security 的“基于表达式的访问控制”(@Pre 和 @Post 注释),类似于 Spring Security Documentation 中的示例。 :
 @PreAuthorize("hasPermission(#contact, 'admin')") 
 public void deletePermission(Contact contact, Sid recipient, Permission permission); 

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

但是,我无法使用 @PreAuthorize(或 @RolesAllowed)注释来处理 Grails Controller 操作。如果我使用@PreAuthorize(而不是@Secured,如上所述)注释列表操作,则会出现以下错误:

Annotation @org.springframework.security.access.prepost.PreAuthorize is not allowed on element FIELD



这并不奇怪 —— Action 是一个 Groovy 闭包(一个包含可执行代码的字段),而不是一个方法。但是,我也尝试在从闭包调用的方法上使用注释,例如:
  def list = { 
    testMethod() 
    .... 
  } 
 
  @PreAuthorize("hasRole('ROLE_USER')") 
  public boolean testMethod(){ 
    println "testMethod succeess" 
    return true; 
  } 

虽然这不会引发任何错误,但它似乎也没有提供任何访问控制。 (无论用户是否拥有 ROLE_USER,都会打印“testMethod success”)。

所以,我尝试了一些不同的东西(并阅读了文档),但一直无法找到一种将 @PreAuthorize 注释与 Grails Controller 操作一起使用的好方法。这可能吗?在 Grails 应用程序中是否有更好的方法来使用 Spring-Security-Annotations 来提供作为系统状态函数的访问控制?

请您参考如下方法:

您需要使用 ACL plugin使用这些注释,但由于您指出的原因,它们不适用于 Controller 操作。 @Secured 之所以有效,是因为我创建了 Spring Security 注释的副本,允许将其放置在字段以及方法和类上,我会查找它们并将它们显式连接起来。您需要使用从 Controller 调用的带注释的服务。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!