網站首頁 編程語言 正文
解決方案:
先直接說下解決方案
,權限點設計成如下:
/api/books/{id:\d*}
問題描述:
獲取書本詳情的標準restful路由,一般是這樣的/api/books/12
, 12即該book的id,如果需要擁有訪問該路由的權限,一般可以這樣設計/api/books/*
。
但是如果類似有一個獲取書本封面的請求,比如:/api/books/getCover
,那么如果給了/api/books/*
這樣的權限的話,getCover這個也可以請求成功,就無法區分了。
源碼分析:
請求地址和權限點匹配判斷代碼:
if(antPathMatcher.match(permission.getRequestUrl(),requestUri)){
...
}
匹配代碼的源碼如下:那我們來分析下
matchStrings
這個方法
private boolean matchStrings(String pattern, String str,
@Nullable Map<String, String> uriTemplateVariables) {
return getStringMatcher(pattern).matchStrings(str, uriTemplateVariables);
}
接下來看下getStringMatcher
protected AntPathStringMatcher getStringMatcher(String pattern) {
AntPathStringMatcher matcher = null;
Boolean cachePatterns = this.cachePatterns;
if (cachePatterns == null || cachePatterns.booleanValue()) {
matcher = this.stringMatcherCache.get(pattern);
}
if (matcher == null) {
matcher = new AntPathStringMatcher(pattern, this.caseSensitive);
if (cachePatterns == null && this.stringMatcherCache.size() >= CACHE_TURNOFF_THRESHOLD) {
// Try to adapt to the runtime situation that we're encountering:
// There are obviously too many different patterns coming in here...
// So let's turn off the cache since the patterns are unlikely to be reoccurring.
deactivatePatternCache();
return matcher;
}
if (cachePatterns == null || cachePatterns.booleanValue()) {
this.stringMatcherCache.put(pattern, matcher);
}
}
return matcher;
}
接下來看AntPathStringMatcher
的構造函數:
public AntPathStringMatcher(String pattern, boolean caseSensitive) {
this.rawPattern = pattern;
this.caseSensitive = caseSensitive;
StringBuilder patternBuilder = new StringBuilder();
Matcher matcher = GLOB_PATTERN.matcher(pattern);
int end = 0;
while (matcher.find()) {
patternBuilder.append(quote(pattern, end, matcher.start()));
String match = matcher.group();
if ("?".equals(match)) {
patternBuilder.append('.');
}
else if ("*".equals(match)) {
patternBuilder.append(".*");
}
else if (match.startsWith("{") && match.endsWith("}")) {
int colonIdx = match.indexOf(':');
if (colonIdx == -1) {
patternBuilder.append(DEFAULT_VARIABLE_PATTERN);
this.variableNames.add(matcher.group(1));
}
else {
String variablePattern = match.substring(colonIdx + 1, match.length() - 1);
patternBuilder.append('(');
patternBuilder.append(variablePattern);
patternBuilder.append(')');
String variableName = match.substring(1, colonIdx);
this.variableNames.add(variableName);
}
}
end = matcher.end();
}
// No glob pattern was found, this is an exact String match
if (end == 0) {
this.exactMatch = true;
this.pattern = null;
}
else {
this.exactMatch = false;
patternBuilder.append(quote(pattern, end, pattern.length()));
this.pattern = Pattern.compile(patternBuilder.toString(),
Pattern.DOTALL | (this.caseSensitive ? 0 : Pattern.CASE_INSENSITIVE));
}
}
看到這里基本上也就明白了,這里如果設定的*
號,這匹配的是.*
,那參考這里
else if (match.startsWith("{") && match.endsWith("}")) {
我們把獲取詳情的權限點設計成
/api/books/{id:\d*}
這樣就可以匹配/api/books/12
或者/api/books/123
之類的詳情,又不會包含/api/books/getCover
這樣的接口。
原文鏈接:https://blog.csdn.net/F_angT/article/details/131563357
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-11-18 阿里云kubernetes查找鏡像中jar包的方法(docker查看鏡像中的jar)_云其它
- 2023-12-11 IOC和AOP概念簡述
- 2022-07-28 Jquery回調對象與延遲對象用法詳解_jquery
- 2022-06-08 自定義Dubbo反序列化
- 2021-12-12 簡單介紹三層架構工作原理_C#教程
- 2023-11-26 (有效解決)Android Studio 運行項目時報 Package install error:
- 2023-03-18 pandas預處理部分地區數據案例_python
- 2022-08-07 python中pd.cut()與pd.qcut()的對比及示例_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支