原來SpringSecurity整合OAuth2後開放許可權攔截路徑還能這麼玩?
當我們整合了Spring Security
以及OAuth2
後發現,有一些業務請求是需要開放的,因為種種原因這時訪問者還沒有身份標識(比如:使用者剛來,還沒有註冊,需要進行新使用者註冊,這時註冊業務相關的介面都應該是開放的
),下面我們來看看ApiBoot
是怎麼排除路徑不進行許可權攔截的。
官方相關檔案
相關ApiBoot Security
官方使用檔案,請訪問 ApiBoot Security。
在檔案的第4. 預設排除路徑
部分,我們瞭解到了ApiBoot Security
為了與其他的第三方框架進行整合,在內部已經添加了一些預設的攔截路徑
,當我們在新增開放路徑
時會在預設的基礎上增量新增,不會覆蓋。
部落格原文地址:blog.yuqiyu.com/apiboot-sec…
建立專案
我們使用IDEA
開發工具建立一個SpringBoot
專案,在pom.xml
內新增相關的依賴,如下所示:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--ApiBoot Security OAuth安全元件-->
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-starter-security-oauth-jwt</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--ApiBoot統一版本依賴-->
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>複製程式碼
排除路徑配置
ApiBoot Security OAuth
安全元件預設攔截配置為/api/**
,也就是/api
下的全部路徑以及子路徑都需要認證後才可以訪問。
我們可以通過api.boot.security.auth-prefix
引數配置修改保護的路徑列表
,ApiBoot
還提供了另外的一個引數配置api.boot.security.ignoring-urls
,用於配置開放的路徑列表
(開放路徑可直接訪問,不走許可權攔截),支援使用Ant
風格,application.yml
配置內容如下所示:
spring:
application:
name: apiboot-security-open-paths-without-intercept
server:
port: 9090
api:
boot:
# ApiBoot Security安全配置
security:
# 許可權攔截的路徑字首
auth-prefix: /**
# 排除不攔截的路徑
ignoring-urls:
- /index/**複製程式碼
我們在application.yml
檔案內配置api.boot.security.ignoring-urls
的值為/index/**
,這時我們在訪問/index
、/index/xxx
路徑時都不會經過許可權的攔截,直接可以訪問到。
示例請求
我們來建立一個名為IndexController
的示例控制器,來驗證我們開放的路徑是否已經生效了,如下所示:
/**
* 示例:控制器
*
* @author 恆宇少年
*/
@RestController
@RequestMapping(value = "/index")
public class IndexController {
/**
* 示例:首頁地址
* /index
*
* @return
*/
@GetMapping
public String index() {
return "this is index page.";
}
/**
* 示例:首頁地址子頁面
* /index/sub
*
* @return
*/
@GetMapping(value = "/sub")
public String indexSub() {
return "this is sub index page.";
}
}複製程式碼
在application.yml
我們配置的開放地址為/index/**
,所以IndexController
控制器內的兩個地址/index
、/index/sub
都會被開放,不走許可權攔截,直接放行。
執行測試
我們使用IDEA
通過XxxApplication
入口類的方式來啟動本章專案原始碼,下面是我們要驗證的測試點。
測試點:開放路徑
我們先來訪問下http://localhost:9090/index
,效果如下所示:
➜ ~ curl http://localhost:9090/index
this is index page.複製程式碼
直接訪問/index
是可以直接獲取介面返回的內容,這也證明瞭一點,這個地址被開放了,不再被許可權攔截。
在之前說到ApiBoot Security OAuth
開放地址支援Ant
風格,我們配置的開放地址為/index/**
,所以/index/sub
這個請求地址也應該已經被開放了,效果如下所示:
➜ ~ curl http://localhost:9090/index/sub
this is sub index page.複製程式碼
如果我們修改
api.boot.security.ignoring-urls
配置為/index
,我們在訪問/index/sub
這個地址時是沒有許可權的,需要攜帶有效的AccessToken
才可以訪問到。
測試點:未開放路徑的攔截
下面我們來完成一個比較特殊的測試點,訪問一個並沒有在後臺定義的路徑,如下所示:
➜ ~ curl http://localhost:9090/index/11
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}複製程式碼
我們並沒有新增/index/xx
這個請求地址的實現,當訪問時同樣也會被攔截,這證明瞭我們發起的請求並沒有到達解析請求就已經被許可權攔截了。
敲黑板,劃重點
除了被開放的路徑都需要提供有效的AccessToken才可以訪問,無論這個地址是否存在,本章為了示例講解方便我這裡配置的許可權攔截根地址為/**
,api.boot.security.auth-paths
引數原始碼是一個陣列(詳見:org.minbox.framework.api.boot.autoconfigure.security.ApiBootSecurityProperties
),可以配置多個地址,比如:/user/**
、/order/**
,api.boot.security.ignoring-urls
同樣支援陣列形式配置多個。
免費教程專題
恆宇少年在部落格整理三套免費學習教程專題
,由於文章偏多
特意添加了閱讀指南
,新文章以及之前的文章都會在專題內陸續填充
,希望可以幫助大家解惑更多知識點。
程式碼示例
如果您喜歡本篇文章請為原始碼倉庫點個Star
,謝謝!!!本篇文章示例原始碼可以通過以下途徑獲取,目錄為apiboot-security-open-paths-without-intercept
:
- Gitee:gitee.com/minbox-proj…
作者個人 部落格
使用開源框架 ApiBoot 助你成為Api介面服務架構師