Api架構奧義:ApiBoot實現零程式碼整合Spring Security & OAuth2
- 2019 年 11 月 13 日
- 筆記
介面服務的安全性一直是程式設計師比較注重的一個問題,成熟的安全框架也比較多,其中一個組合就是Spring Security與OAuth2的整合,在ApiBoot內通過程式碼的封裝、自動化配置實現了自動化整合這兩大安全框架。
部落格原文:http://blog.yuqiyu.com/apiboot-security-oauth-zero-code-integration.html
ApiBoot Security OAuth簡介
ApiBoot Security OAuth是ApiBoot開源項目內的一個組件,內部通過SpringBoot AutoConfiguration整合了Spring Security、OAuth2,而且支援多種存儲方式,如:記憶體(memory)、資料庫(jdbc)、Redis等,使用配置文件的方式來代替程式碼侵入式集成方式,提高開發效率、減少非業務的繁瑣程式碼,而且還有這比較高的可擴展性。
- ApiBoot 源碼(源碼詳見:api-boot-plugins、api-boot-autoconfigure目錄):https://gitee.com/minbox-projects/api-boot
- ApiBoot Security使用文檔:http://apiboot.minbox.io/zh-cn/docs/api-boot-security.html
- ApiBoot OAuth使用文檔:http://apiboot.minbox.io/zh-cn/docs/api-boot-oauth.html
創建項目
通過Idea開發工具創建一個名為apiboot-security-oauth-zero-code-integration的SpringBoot項目。
添加ApiBoot統一版本依賴
在添加依賴之前我們需要將ApiBoot的統一版本依賴加入到我們項目的pom.xml文件內,如下所示:
<!--ApiBoot統一版本依賴--> <dependencyManagement> <dependencies> <dependency> <groupId>org.minbox.framework</groupId> <artifactId>api-boot-dependencies</artifactId> <version>2.1.5.RELEASE</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
添加ApiBoot Security OAuth依賴
添加完成版本依賴後,我們繼續在pom.xml文件內添加ApiBoot Security OAuth依賴,如下所示:
<dependencies> <!--SpringBoot Web--> <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>
配置ApiBoot Security用戶列表
ApiBoot Security默認支援記憶體方式(memory)配置用戶列表,用於整合OAuth2的密碼授權方式(grant_type=password),我們需要在application.yml配置文件內添加相關配置,如下所示:
spring: application: name: apiboot-security-oauth-first-application server: port: 9090 # ApiBoot 相關配置 api: boot: # ApiBoot Security配置 security: # 配置記憶體用戶列表 users: - username: hengboy password: 123456 - username: yuqiyu password: 123123
通過api.boot.security.users參數可以配置多個用戶資訊,每個用戶可配置username、password、roles,可以通過查看org.minbox.framework.api.boot.autoconfigure.security.ApiBootSecurityProperties源碼類了解詳情。
- username:配置
Spring Security用戶的用戶名。 - password:配置
Spring Security用戶的密碼。 - roles:配置
Spring Security用戶對應授權的角色列表,多個可以使用英文半形,隔開,或者使用-方式配置。
運行測試
我們通過XxxApplication方式啟動本章項目。
測試點:獲取AccessToken
項目運行成功後我們先來測試下是否可以獲取到AccessToken。
Curl方式獲取:
➜ ~ curl -X POST ApiBoot:ApiBootSecret@localhost:9090/oauth/token -d "grant_type=password&username=hengboy&password=123456" {"access_token":"f16202f7-ab8c-41ae-86be-e314aebe82ff","token_type":"bearer","refresh_token":"93c74812-ec5b-4676-8378-b68e4c1751ae","expires_in":3297,"scope":"api"}PostMan方式獲取:

如果對Spring Security與OAuth2整合有一定經驗的同學應該明白grant_type是OAuth2內提供的其中一種授權方式,而參數username、password則是整合後對應的Spring Security的用戶名以及密碼,也就是我們在application.yml配置文件api.boot.security.users配置用戶列表的其中一個用戶資訊。
在上面分別通過Curl、PostMan兩種方式進行測試獲取AccessToken,都是可以直接獲取到的。
測試點:獲取當前用戶資訊
ApiBoot Security OAuth獲取當前用戶資訊的方式與Spring Security一樣,通過注入java.security.Principal介面來完成,下面我們創建一個名為UserController的控制器來測試下效果:
package org.minbox.chapter.apiboot.security.oauth.first.application; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.security.Principal; /** * 登錄用戶資訊 * * @author 恆宇少年 */ @RestController @RequestMapping(value = "/api/user") public class UserController { /** * 獲取當前登錄的用戶資訊 * 通過Spring Security提供的註解{@link PreAuthorize}進行驗證角色 * * @param principal {@link Principal} * @return {@link Principal#getName()} */ @GetMapping @PreAuthorize("hasRole('api')") public String info(Principal principal) { return principal.getName(); } }注意:
ApiBoot Security OAuth默認許可權攔截的路徑時/api/**,所以我們在測試控制器上配置了/api/user作為路徑前綴,如果想對ApiBoot Security OAuth詳細了解,請訪問ApiBoot官網文檔ApiBoot Security使用文檔
我們通過Curl方式訪問http://localhost:9090/api/user介面效果如下:
➜ ~ curl http://localhost:9090/api/user -H 'Authorization: Bearer d73e86a8-892f-42c1-bc95-04aedfe97828' hengboy
訪問/api/user路徑的AccessToken是通過用戶hengboy用戶生成的,所以該介面返回了hengboy用戶名。
敲黑板,劃重點
ApiBoot Security OAuth極其簡單的完成了Spring Security與OAuth2的整合,使用記憶體方式時不需要配置一行程式碼就可以完成自動化的整合。
程式碼示例
本篇文章示例源碼可以通過以下途徑獲取,目錄為SpringBoot2.x/apiboot-security-oauth-first-application:
