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

  • 2019 年 11 月 13 日
  • 筆記

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

部落格原文:http://blog.yuqiyu.com/apiboot-security-oauth-zero-code-integration.html

ApiBoot Security OAuth簡介

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

創建項目

通過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:

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

Tags: