[TOC] ## 一、mall開源項目 ### 1.1 來源 **mall學習教程**,架構、業務、技術要點全方位解析。mall項目(**50k+star**)是一套電商系統,使用現階段主流技術實現。涵蓋了SpringBoot 2.3.0、MyBatis 3.4.6、Elasticsearch 7. ...
目錄
一、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}
介面無法正常訪問,返回code
為403
這裡就不對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
無法正常訪問,返回code
為403
這裡就不對admin進行測試展示了,下方是對macro用戶
進行測試,查看沒有許可權的效果。
四、總結
本文是有我先從實際項目中獲取需求,從而對SpringSecurity
和Oath2
的學習,結合源碼來學習,到另一個項目由於鑒權已經部署在不同的ip,項目使用調用即可,項目中使用了 Sa-Token 是一個輕量級 Java 許可權認證框架 ,看官網是看的明白,但是不懂如何入手,就有了此文,從mall
開源項目中學習sa-token,感覺收穫頗深,希望這篇文章對你們也會有所幫助。
後續我也會結合該框架學習一下其他的技術棧。
七夕~盈若安好,便是晴天