介面服務的安全性一直是程式設計師比較注重的一個問題,成熟的安全框架也比較多,其中一個組合就是Spring Security
與OAuth2
的整合,在ApiBoot
內通過程式碼的封裝、自動化配置實現了自動化整合這兩大安全框架。
部落格原文:blog.yuqiyu.com/apiboot-sec…
ApiBoot Security OAuth簡介
ApiBoot Security OAuth
是ApiBoot
開源專案內的一個元件,內部通過SpringBoot AutoConfiguration
整合了Spring Security
、OAuth2
,而且支援多種儲存方式,如:記憶體(memory)
、資料庫(jdbc)
、Redis
等,使用配置檔案的方式來代替程式碼侵入式整合方式,提高開發效率、減少非業務的繁瑣程式碼,而且還有這比較高的可擴充套件性。
-
ApiBoot 原始碼(原始碼詳見:api-boot-plugins、api-boot-autoconfigure目錄):gitee.com/minbox-proj…
-
ApiBoot Security使用文件:apiboot.minbox.io/zh-cn/docs/…
-
ApiBoot OAuth使用文件:apiboot.minbox.io/zh-cn/docs/…
建立專案
通過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
:
- Gitee:gitee.com/hengboy/spr…