mall :sa-token專案原始碼解析

2023-08-22 18:03:22

一、mall開源專案

1.1 來源

mall學習教學,架構、業務、技術要點全方位解析。mall專案(50k+star)是一套電商系統,使用現階段主流技術實現。涵蓋了SpringBoot 2.3.0、MyBatis 3.4.6、Elasticsearch 7.6.2、RabbitMQ 3.7.15、Redis 5.0、MongoDB 4.2.5、Mysql5.7等技術,採用Docker容器化部署。

專案github地址: mall開源專案

1.2 專案轉移

可以把github上的專案轉移到gitee上,方便克隆到idea。

具體步驟如下:

1.3 專案克隆

由於github部署在國外,雖然idea也支援從github上拉取,但是克隆速度太慢,所以才推薦上述匯入gitee後在克隆專案到idea。

具體的克隆步驟過於簡單和常規化,讀者可自行完成,或百度一下~

二、Sa-Toekn框架

2.1 Sa-Token 簡介

Sa-Token 是一個輕量級 Java 許可權認證框架,主要解決:登入認證許可權認證單點登入OAuth2.0分散式Session對談微服務閘道器鑑權 等一系列許可權相關問題。

Sa-Token 目前主要五大功能模組:登入認證、許可權認證、單點登入、OAuth2.0、微服務鑑權。

功能概覽圖如下:

sa-token開發檔案地址: 框架介紹 (sa-token.cc)

2.2 分散式後端專案的使用流程

下圖是結合專案經歷,外加百度查詢資料,自行總結的基本使用流程。

sa-token的使用流程圖如下:

2.3 分散式後端專案的使用場景

下圖是結合專案經歷,外加百度查詢資料,自行總結的基本使用場景。

sa-token的使用場景圖如下:

三、原始碼解析

看原始碼自我總結出來的看新專案時的基本步驟,首先先看整合和設定,在從業務的角度來分析,結合整合的框架和元件,來依次剝削系統的架構。

解析內容:下方的解析內容大部分在圖中解釋,外面就不做過多的闡述。

3.1 整合與設定

直接拿原始碼分析,只分析與sa-token有關的部分,其它部分讀者請,自行看原始碼分析。

專案啟動:只需要啟動mall-tiny-sa-token模組的部分即可。

啟動所需:啟動mysql5的服務,建立資料庫,並匯入表(sql檔案位置在,專案同級目錄的document資料夾裡)。

ps:記得修改資料庫連線的設定資訊。

3.1.1 匯入依賴

pom檔案中匯入sa-token的相關依賴。

3.1.2 新增設定

application.yml中新增sa-token的相關設定,專案支援前後端分離專案,關閉從 cookie 中讀取 token,改為從 head 中讀取 token的設定。

3.1.3 例外處理

對於處理未登入的、沒有許可權的、沒有角色的異常,需要全域性處理一下。

拿登入來做個小例子:由於未登入狀態下存取介面,Sa-Token 會丟擲NotLoginException異常,此時會根據自定義的返回資訊,返回狀態碼401和響應資訊未提供token(例外處理的結果資訊)。

3.1.4 儲存使用者資訊

有兩個使用者,admin使用者具有ROLE_ADMIN角色,macro使用者具有ROLE_USER角色。

ps:模擬資料庫兩張表的關聯資訊是根據id來關聯的,也就是給使用者分配角色。

3.2 登入認證

3.2.1 設定黑白名單

在管理系統中,除了登入介面,基本上都需要登入認證,在 sa-token中使用路由攔截鑑權是最方便的,也就是說給sa-token設定攔截器,實現WebMvcConfigurer介面,設定黑白名單。

ps:自定義的白名單是從application.yml檔案中獲取到的資訊。

3.2.2 登入業務程式碼解讀

1.首先是控制層, 在UmsAdminController中新增一個登入介面login

2.接著業務層, 在UmsAdminServiceImpl新增登入的具體邏輯,先驗證密碼,然後呼叫StpUtil.login(adminUser.getId())即可實現登入。

3.2.3 測試登入

方式一:使用Postman測試

方式二:使用swagger介面檔案測試(建議使用,以及編寫好,直接存取即可測試,存取地址為: Swagger UI ),由於已經拿到token,就不做重複測試了,直接測另一個介面,查詢當前登入狀態的介面。

3.3 角色認證

緊接上文,我來實現一下吧!對於角色認證也就是定義好一套存取介面的規則,比如ROLE-ADMIN角色可以存取/brand下的所有資源,而ROLE_USER角色只能存取/brand/listAll下的資源。

設定全域性異常:見副標題3.1.3有所描述,不做過多陳訴。

當用戶不是被允許的角色存取時,Sa-Token會丟擲NotRoleException異常。

3.3.1 許可權驗證介面擴充套件

擴充套件 sa-token的StpInterface介面,重寫方法來返回使用者的角色名稱和角色許可權列表。

由於StpInterfaceImpl實現了StpInterface介面,重寫了裡面的方法。所以在SaTokenConfig的組態檔中的StpUtil.checkRole("ROLE_ADMIN")才能匹配到模擬的資料庫的角色資訊。許可權資訊也是同理,不一一列舉了。

3.3.2 設定攔截器

在攔截器中設定路由規則,ROLE_ADMIN角色可以存取所有路徑,而ROLE_USER只能存取/brand/listAll路徑。

3.3.3 測試角色

對於 admin使用者具有ROLE_ADMIN角色,macro使用者具有ROLE_USER角色 。

  • 使用admin賬號存取/brand/{id}介面可以正常存取
  • 使用macro賬號存取/brand/{id}介面無法正常存取,返回code403

這裡就不對admin進行測試展示了,下方是對macro使用者進行測試,檢視沒有許可權的效果。

3.4 許可權認證

當給角色分配好許可權,然後給使用者分配好角色後,使用者就擁有了這些許可權。

對於許可權認證,也可以為每個介面分配不同的許可權,擁有該許可權的使用者就可以存取該介面。

設定全域性異常:見副標題3.1.3有所描述,不做過多陳訴。

使用者無許可權存取時,Sa-Token 會丟擲NotPermissionException異常。

3.4.1 設定攔截器

給攔截器設定路由規則admin使用者可以存取所有路徑,而macro使用者只有讀取的許可權,沒有寫、改、刪的許可權。

3.4.2 測試許可權

對於 admin使用者可以存取所有路徑,而macro使用者只有讀取的許可權,沒有寫、改、刪的許可權。

  • 使用admin賬號存取/brand/delete介面可以正常存取
  • 使用macro賬號存取/brand/delete無法正常存取,返回code403

這裡就不對admin進行測試展示了,下方是對macro使用者進行測試,檢視沒有許可權的效果。

四、總結

本文是有我先從實際專案中獲取需求,從而對SpringSecurityOath2的學習,結合原始碼來學習,到另一個專案由於鑑權已經部署在不同的ip,專案使用呼叫即可,專案中使用了 Sa-Token 是一個輕量級 Java 許可權認證框架 ,看官網是看的明白,但是不懂如何入手,就有了此文,從mall開源專案中學習sa-token,感覺收穫頗深,希望這篇文章對你們也會有所幫助。

後續我也會結合該框架學習一下其他的技術棧。

七夕~盈若安好,便是晴天