Api架構(gòu)奧義:ApiBoot實現(xiàn)零代碼整合Spring Security & OAuth2

接口服務(wù)的安全性一直是程序員比較注重的一個問題,成熟的安全框架也比較多,其中一個組合就是Spring SecurityOAuth2的整合,在ApiBoot內(nèi)通過代碼的封裝、自動化配置實現(xiàn)了自動化整合這兩大安全框架。

免費教程專題

恒宇少年在博客整理三套免費學習教程專題,由于文章偏多特意添加了閱讀指南,新文章以及之前的文章都會在專題內(nèi)陸續(xù)填充,希望可以幫助大家解惑更多知識點。

博客原文:http://blog.yuqiyu.com/apiboot-security-oauth-zero-code-integration.html

ApiBoot Security OAuth簡介

ApiBoot Security OAuthApiBoot開源項目內(nèi)的一個組件,內(nèi)部通過SpringBoot AutoConfiguration整合了Spring SecurityOAuth2,而且支持多種存儲方式,如:內(nèi)存(memory)、數(shù)據(jù)庫(jdbc)、Redis等,使用配置文件的方式來代替代碼侵入式集成方式,提高開發(fā)效率、減少非業(yè)務(wù)的繁瑣代碼,而且還有這比較高的可擴展性。

創(chuàng)建項目

通過Idea開發(fā)工具創(chuàng)建一個名為apiboot-security-oauth-zero-code-integrationSpringBoot項目。

添加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 SecurityOAuth2整合有一定經(jīng)驗的同學應(yīng)該明白grant_typeOAuth2內(nèi)提供的其中一種授權(quán)方式,而參數(shù)username、password則是整合后對應(yīng)的Spring Security用戶名以及密碼,也就是我們在application.yml配置文件api.boot.security.users配置用戶列表的其中一個用戶信息。

在上面分別通過CurlPostMan兩種方式進行測試獲取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 SecurityOAuth2的整合,使用內(nèi)存方式時不需要配置一行代碼就可以完成自動化的整合。

代碼示例

本篇文章示例源碼可以通過以下途徑獲取,目錄為SpringBoot2.x/apiboot-security-oauth-first-application

作者個人 博客
使用開源框架 ApiBoot 助你成為Api接口服務(wù)架構(gòu)師

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容