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

在我正在使用的 Grails 中

import grails.plugin.springsecurity.annotation.Secured

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

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

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

有什么想法吗?

【问题讨论】:

标签: spring grails spring-security grails-3.0


【解决方案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 的方式更细化。
    猜你喜欢
    • 2014-03-01
    • 2011-12-16
    • 2015-02-06
    • 2016-08-21
    • 2021-09-27
    • 2016-08-11
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多