如何在 Spring sec 中为组使用属性:hasAnyRole 的授权标签

Posted

技术标签:

【中文标题】如何在 Spring sec 中为组使用属性:hasAnyRole 的授权标签【英文标题】:How to use a property for group in Spring sec:authorize tag for hasAnyRole 【发布时间】:2022-01-17 04:01:09 【问题描述】:

我正在尝试使用一个属性来指定要在 jsp sec:authorize 标记中使用的组,因为这些组将根据部署此应用程序的区域而有所不同。使用硬编码的组名,以下工作:

<sec:authorize access="hasAnyRole('GRP_MY_GROUP_DEV')">

我希望我可以按照这个思路做一些事情(这是行不通的,它只是表现得好像我不在小组中):

<sec:authorize access="hasAnyRole($allowed.groups.property)">

【问题讨论】:

【参考方案1】:

您可以创建一个@Bean 并引用它。

@Component("authz")
public class JspAuthorizeAccess 
    @Value("$allowed.groups.property")
    Set<String> allowedGroups;

    public boolean hasAnyRole(Authentication authentication) 
        var authorities = authentication.getAuthorities();
        var userGroups = AuthorityUtils.authorityListToSet(authorities);
        return !Collections.disjoint(allowedGroups, userGroups);
     

<sec:authorize access="@authz.hasAnyRole(authentication)">

【讨论】:

【参考方案2】:

我最终只是自动装配了 groups 属性并将其添加到我的控制器中的模型中:

@Value("$allowed.groups.property")
private String adminGroups;
 ...
model.addAttribute("adminGroups", adminGroups);

然后在我的jsp中:

<sec:authorize access="hasAnyRole('$adminGroups')">

这可以满足我的需要,我只是想知道我是否可以在 jsp 中更干净地完成它。

【讨论】:

以上是关于如何在 Spring sec 中为组使用属性:hasAnyRole 的授权标签的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有临时表的 SQL 查询中为组添加序列号

在Ansible中为组添加公共变量的位置

如何在基于xml的spring配置中为hibernate.javax.cache.uri属性指定相对路径

如何在 Spring Security thymeleaf sec 中使用列表:授权标签

sec:authorize 在 thymeleaf 视图中为 isAuthenticated() 和 isAnonymous() 返回 true

sec:authorize 在 thymeleaf 视图中为 isAuthenticated() 和 isAnonymous() 返回 true