接口服務的安全性一直是程序員比較注重的一個問題,成熟的安全框架也比較多,其中一個組合就是Spring Security
與OAuth2
的整合,在ApiBoot
內經過代碼的封裝、自動化配置實現了自動化整合這兩大安全框架。html
博客原文:blog.yuqiyu.com/apiboot-sec…java
ApiBoot Security OAuth
是ApiBoot
開源項目內的一個組件,內部經過SpringBoot AutoConfiguration
整合了Spring Security
、OAuth2
,並且支持多種存儲方式,如:內存(memory)
、數據庫(jdbc)
、Redis
等,使用配置文件的方式來代替代碼侵入式集成方式,提升開發效率、減小非業務的繁瑣代碼,並且還有這比較高的可擴展性。git
ApiBoot 源碼(源碼詳見:api-boot-plugins、api-boot-autoconfigure目錄):gitee.com/minbox-proj…程序員
ApiBoot Security使用文檔:apiboot.minbox.io/zh-cn/docs/…web
ApiBoot OAuth使用文檔:apiboot.minbox.io/zh-cn/docs/…spring
經過Idea
開發工具建立一個名爲apiboot-security-oauth-zero-code-integration
的SpringBoot
項目。數據庫
在添加依賴以前咱們須要將ApiBoot
的統一版本依賴加入到咱們項目的pom.xml
文件內,以下所示:api
<!--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>
複製代碼
添加完成版本依賴後,咱們繼續在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
默認支持內存方式(memory)
配置用戶列表
,用於整合OAuth2
的密碼受權方式(grant_type=password)
,咱們須要在application.yml
配置文件內添加相關配置,以下所示:bash
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
源碼類瞭解詳情。
Spring Security
用戶的用戶名。Spring Security
用戶的密碼。Spring Security
用戶對應受權的角色列表,多個可使用英文半角,
隔開,或者使用-
方式配置。咱們經過XxxApplication
方式啓動本章項目。
項目運行成功後咱們先來測試下是否能夠獲取到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
: