接口服務(wù)的安全性一直是程序員比較注重的一個問題,成熟的安全框架也比較多,其中一個組合就是Spring Security與OAuth2的整合,在ApiBoot內(nèi)通過代碼的封裝、自動化配置實現(xiàn)了自動化整合這兩大安全框架。
免費教程專題
恒宇少年在博客整理三套免費學習教程專題,由于文章偏多特意添加了閱讀指南,新文章以及之前的文章都會在專題內(nèi)陸續(xù)填充,希望可以幫助大家解惑更多知識點。
博客原文:http://blog.yuqiyu.com/apiboot-security-oauth-zero-code-integration.html
ApiBoot Security OAuth簡介
ApiBoot Security OAuth是ApiBoot開源項目內(nèi)的一個組件,內(nèi)部通過SpringBoot AutoConfiguration整合了Spring Security、OAuth2,而且支持多種存儲方式,如:內(nèi)存(memory)、數(shù)據(jù)庫(jdbc)、Redis等,使用配置文件的方式來代替代碼侵入式集成方式,提高開發(fā)效率、減少非業(yè)務(wù)的繁瑣代碼,而且還有這比較高的可擴展性。
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
創(chuàng)建項目
通過Idea開發(fā)工具創(chuàng)建一個名為apiboot-security-oauth-zero-code-integration的SpringBoot項目。
添加ApiBoot統(tǒng)一版本依賴
在添加依賴之前我們需要將ApiBoot的統(tǒng)一版本依賴加入到我們項目的pom.xml文件內(nèi),如下所示:
<!--ApiBoot統(tǒng)一版本依賴-->
<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依賴
添加完成版本依賴后,我們繼續(xù)在pom.xml文件內(nèi)添加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默認支持內(nèi)存方式(memory)配置用戶列表,用于整合OAuth2的密碼授權(quán)方式(grant_type=password),我們需要在application.yml配置文件內(nèi)添加相關(guān)配置,如下所示:
spring:
application:
name: apiboot-security-oauth-first-application
server:
port: 9090
# ApiBoot 相關(guān)配置
api:
boot:
# ApiBoot Security配置
security:
# 配置內(nèi)存用戶列表
users:
- username: hengboy
password: 123456
- username: yuqiyu
password: 123123
通過api.boot.security.users參數(shù)可以配置多個用戶信息,每個用戶可配置username、password、roles,可以通過查看org.minbox.framework.api.boot.autoconfigure.security.ApiBootSecurityProperties源碼類了解詳情。
-
username:配置
Spring Security用戶的用戶名。 -
password:配置
Spring Security用戶的密碼。 -
roles:配置
Spring Security用戶對應(yīng)授權(quán)的角色列表,多個可以使用英文半角,隔開,或者使用-方式配置。
運行測試
我們通過XxxApplication方式啟動本章項目。
測試點:獲取AccessToken
項目運行成功后我們先來測試下是否可以獲取到AccessToken。
Curl方式獲?。?/strong>
? ~ 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方式獲?。?/strong>

如果對Spring Security與OAuth2整合有一定經(jīng)驗的同學應(yīng)該明白grant_type是OAuth2內(nèi)提供的其中一種授權(quán)方式,而參數(shù)username、password則是整合后對應(yīng)的Spring Security的用戶名以及密碼,也就是我們在application.yml配置文件api.boot.security.users配置用戶列表的其中一個用戶信息。
在上面分別通過Curl、PostMan兩種方式進行測試獲取AccessToken,都是可以直接獲取到的。
測試點:獲取當前用戶信息
ApiBoot Security OAuth獲取當前用戶信息的方式與Spring Security一樣,通過注入java.security.Principal接口來完成,下面我們創(chuàng)建一個名為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默認權(quán)限攔截的路徑時/api/**,所以我們在測試控制器上配置了/api/user作為路徑前綴,如果想對ApiBoot Security OAuth詳細了解,請訪問ApiBoot官網(wǎng)文檔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的整合,使用內(nèi)存方式時不需要配置一行代碼就可以完成自動化的整合。
代碼示例
本篇文章示例源碼可以通過以下途徑獲取,目錄為SpringBoot2.x/apiboot-security-oauth-first-application: