Grails:OR 角色的@Secured 注释

Posted

技术标签:

【中文标题】Grails:OR 角色的@Secured 注释【英文标题】:Grails: @Secured annotation for OR roles 【发布时间】:2017-05-28 13:47:14 【问题描述】:

在我正在使用的 Grails 中

import grails.plugin.springsecurity.annotation.Secured

@Secured('ROLE_COMPANY', 'ROLE_BACKEND_ADMIN')
class MobileSendersController 

但它在角色之间建立了 AND 关系。我需要一个 OR 关系。允许访问ROLE_COMPANYROLE_BACKEND_ADMIN

在这个question 中,答案建议使用@PreAuthorize。我在 Grails 中尝试过,但没有运气。也许我需要修改前注和后注,但我找不到配置。

有什么想法吗?

【问题讨论】:

***.com/questions/34182034/… 将提供有关如何让角色组发挥作用的线索。 【参考方案1】:

如果你看一下documentation 前面的@Secured,你会发现它使用了SpEL 表达式(documentation,关于这个),所以你可以做很多事情。特别是,您可能希望像这样使用hasAnyRole()

@Secured("hasAnyRole('ROLE_COMPANY', 'ROLE_BACKEND_ADMIN')")

【讨论】:

乔希,我已经改变了接受的答案,因为@Ankit Agrawal 的答案是更多的 Grails。 @zatziky,好吧,不知道是什么让他的回答比我的更像 Grails。它们都使用相同的插件和相同的注释。不过你的选择。 乔希,你可能是对的。我觉得它更好,因为它更短。这是有争议的,因为对于新手来说,hasAnyRole 更全面。所以你们都同意接受的答案。 @zatziky 完全不用担心,很高兴您解决了问题! 哈哈@JoshuaMoore 我第一天就更喜欢你的回答,所以给了你一个高分:)我和你在一起【参考方案2】:

这样就可以解决问题了——

import grails.plugin.springsecurity.annotation.Secured

@Secured(['ROLE_COMPANY', 'ROLE_BACKEND_ADMIN'])
class MobileSendersController 

参考文档http://grails-plugins.github.io/grails-spring-security-core/v3/index.html#securedAnnotations

【讨论】:

【参考方案3】:

为什么一个控制器有两个角色?也许考虑为您的控制器设置一个权限,然后您可以将该权限添加到您的 ROLE_COMPANY 和 ROLE_BACKEND_ADMIN 角色。

【讨论】:

有趣的想法。但。假设您有角色 A、B、C 和控制器 C1、C2、C3。 A 和 B 可以访问 C1。B、C 可以访问 C2。A 只能访问 C3。使用您的方法,每个控制器都需要特殊许可。 OR 的方式更细化。

以上是关于Grails:OR 角色的@Secured 注释的主要内容,如果未能解决你的问题,请参考以下文章

Grails 检查特定控制器操作的角色访问

使用 Spring Security 的 @Secured 注释中是不是允许多个角色

在 Grails 中,如何在自动化测试中测试 @Secured 注解?

Spring安全注释预期为内联常量

Grails Spring Security注释问题

无法在 Spring Security 中获取 @Secured Method Security 注释