我试图配置我的API并根据jwt的权限限制访问,我的权限格式如下:"角色_监视器|1 "或"角色监视器|2 "或"角色监视器|3 "等字符后的数字|'可以是任何数字。
我这样配置:
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/users").access("hasAuthority('^ROLE_MON\\|[0-9]+$')")
.anyRequest().authenticated();
但不管用。
注意:如果没有正则表达式,则此操作有效,例如.antMatchers("/users").access("hasAuthority('ROLE_MON|1')")
适用于权限'ROLE_MON| 1'
我使用的是这个版本的springBoot:
plugins {
id 'java'
id 'org.springframework.boot' version '2.6.13'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
我的依赖关系:
implementation(group: 'org.springframework.security.oauth', name: 'spring-security-oauth2', version: '2.5.2.RELEASE'){
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
implementation(group: 'org.springframework.security.oauth.boot', name: 'spring-security-oauth2-autoconfigure', version: '2.6.8'){
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
implementation(group: 'org.springframework.boot', name: 'spring-boot-starter-security'){
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
implementation(group: 'org.springframework.security', name: 'spring-security-jwt', version: '1.0.9.RELEASE'){
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
我试过:antMatchers("/users").access("hasAuthority('^ROLE_MON.*')")
以及antMatchers("/users").access("hasAuthority('^ROLE_MON.+')")
但是不起作用
1条答案
按热度按时间fnx2tebb1#
使用默认RoleVoter无法执行此操作
Spring安全性只检查字符串是否相等,所以你不能在这里使用正则表达式。在你给出的例子中,你的令牌中的字符串
^ROLE_MON.*
和^ROLE_MON.+
是不存在的。有几种方法可以解决这个问题,最好的解决方案取决于你的需要。编写自己的AccessDecisionVoter以提供正则表达式匹配:
你可以写一个可以接受正则表达式的custom AccessDecisionVoter,如果你不能枚举你现有的角色(可能是因为它们是动态生成的,或者因为它们太多了),这将是你唯一的最佳解决方案。
创建可用于向现有角色给予权限的一般角色:
如果你希望所有这些角色都能够访问此终结点,可以将它们添加到role hierarchy的一般角色下,以便每个
ROLE_MON|.*
都具有一般角色的权限。然后,可以将一般角色的名称添加到hasAuthority字符串,并使用该字符串配置对终结点的访问权限。只有在你可以合理地枚举要使用的角色时,才有可能实现这一点。使用hasAnyAuthority和角色列表
此方法允许您提供角色列表,例如:
如果角色的数量很小,这将是最简单的解决方案,并且不会很难维护,但可能会很难看或不可能,这取决于您有多少角色。