Api架構奧義:ApiBoot實現零程式碼整合Spring Security & OAuth2

恆宇少年發表於2019-11-12

介面服務的安全性一直是程式設計師比較注重的一個問題,成熟的安全框架也比較多,其中一個組合就是Spring SecurityOAuth2的整合,在ApiBoot內通過程式碼的封裝、自動化配置實現了自動化整合這兩大安全框架。

部落格原文:blog.yuqiyu.com/apiboot-sec…

ApiBoot Security OAuth簡介

ApiBoot Security OAuthApiBoot開源專案內的一個元件,內部通過SpringBoot AutoConfiguration整合了Spring SecurityOAuth2,而且支援多種儲存方式,如:記憶體(memory)資料庫(jdbc)Redis等,使用配置檔案的方式來代替程式碼侵入式整合方式,提高開發效率、減少非業務的繁瑣程式碼,而且還有這比較高的可擴充套件性。

建立專案

通過Idea開發工具建立一個名為apiboot-security-oauth-zero-code-integrationSpringBoot專案。

新增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引數可以配置多個使用者資訊,每個使用者可配置usernamepasswordroles,可以通過檢視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方式獲取:

Api架構奧義:ApiBoot實現零程式碼整合Spring Security & OAuth2

如果對Spring SecurityOAuth2整合有一定經驗的同學應該明白grant_typeOAuth2內提供的其中一種授權方式,而引數usernamepassword則是整合後對應的Spring Security使用者名稱以及密碼,也就是我們在application.yml配置檔案api.boot.security.users配置使用者列表的其中一個使用者資訊

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

程式碼示例

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

作者個人 部落格 使用開源框架 ApiBoot 助你成為Api介面服務架構師

相關文章