Skip to content

Commit 24cc062

Browse files
committed
feat: 根据 spring 路径优先级比较来确定生效的 api 角色配置
1 parent 2b5a613 commit 24cc062

1 file changed

Lines changed: 11 additions & 5 deletions

File tree

framework/src/main/java/top/cadecode/uniboot/framework/security/voter/DataBaseRoleVoter.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import top.cadecode.uniboot.system.service.SysApiService;
1414

1515
import java.util.Collection;
16+
import java.util.Comparator;
1617
import java.util.List;
1718
import java.util.Objects;
1819

@@ -44,13 +45,18 @@ public int vote(Authentication authentication, Object object, Collection<ConfigA
4445
// 获取用户角色
4546
SysUserDto.SysUserDetailsDto sysUserDetailsDto = TokenAuthHolder.getUserDetails(authentication);
4647
List<String> roles = sysUserDetailsDto.getRoles();
47-
// 获取与 url 相同的配置,不存在与 url 相同配置则使用 ant 风格匹配
48+
// 获取与 url 相同的配置,不存在与 url 相同配置则使用 spring mvc ant 风格匹配
4849
SysApiRolesVo sysApiRolesVo = sysApiRolesVos.stream()
49-
.filter(api -> api.getUrl().equals(requestUrl))
50+
.filter(api -> requestUrl.equals(api.getUrl()))
5051
.findFirst()
51-
.orElseGet(() -> sysApiRolesVos.stream()
52-
.filter(api -> antPathMatcher.match(api.getUrl(), requestUrl))
53-
.findFirst().orElse(null));
52+
.orElseGet(() -> {
53+
// 按 spring mvc 路径优先级找到优先级最高的配置
54+
Comparator<String> comparator = antPathMatcher.getPatternComparator(requestUrl);
55+
return sysApiRolesVos.stream()
56+
.filter(api -> antPathMatcher.match(api.getUrl(), requestUrl))
57+
.min((o1, o2) -> comparator.compare(o1.getUrl(), o2.getUrl()))
58+
.orElse(null);
59+
});
5460
// 数据库没有配置就弃权
5561
if (Objects.isNull(sysApiRolesVo)) {
5662
return ACCESS_ABSTAIN;

0 commit comments

Comments
 (0)