在 Grails 中使用 Pre/Post Spring-Security Annotations

Posted

技术标签:

【中文标题】在 Grails 中使用 Pre/Post Spring-Security Annotations【英文标题】:Using Pre/Post Spring-Security Annotations with Grails 【发布时间】:2011-03-31 07:22:26 【问题描述】:

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

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

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

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

这可行 - 仅向具有 ROLE_USER 角色的人提供对 list 操作/视图的访问权限。

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

我可以做这样的事情的一种方法是使用 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,如上所述)注释 list 操作,我会收到以下错误:

注解 @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”)。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于在 Grails 中使用 Pre/Post Spring-Security Annotations的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Grails 上开发新的资源包?

Grails:Spring Security 插件对于简单的安全性来说是不是过于强大

solr:突出显示:hl.simple.pre/post 有时不会出现

腾讯TMQ浅谈Chromium中的设计模式——pre/post和Delegate模式

如何使用 Django 信号(Pre_save,Post_save)从“B”模型的 ImageField 设置“A”模型的 ImageField

RecyclerView 动画原理 | pre-layout,post-layout 与 scrap 缓存的关系