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開源專案
可以把github上的專案轉移到gitee上,方便克隆到idea。
具體步驟如下:
由於github部署在國外,雖然idea也支援從github上拉取,但是克隆速度太慢,所以才推薦上述匯入gitee後在克隆專案到idea。
具體的克隆步驟過於簡單和常規化,讀者可自行完成,或百度一下~
Sa-Token 是一個輕量級 Java 許可權認證框架,主要解決:登入認證、許可權認證、單點登入、OAuth2.0、分散式Session對談、微服務閘道器鑑權 等一系列許可權相關問題。
Sa-Token 目前主要五大功能模組:登入認證、許可權認證、單點登入、OAuth2.0、微服務鑑權。
功能概覽圖如下:
sa-token開發檔案地址: 框架介紹 (sa-token.cc)
下圖是結合專案經歷,外加百度查詢資料,自行總結的基本使用流程。
sa-token的使用流程圖如下:
下圖是結合專案經歷,外加百度查詢資料,自行總結的基本使用場景。
sa-token的使用場景圖如下:
看原始碼自我總結出來的看新專案時的基本步驟,首先先看整合和設定,在從業務的角度來分析,結合整合的框架和元件,來依次剝削系統的架構。
解析內容:下方的解析內容大部分在圖中解釋,外面就不做過多的闡述。
直接拿原始碼分析,只分析與sa-token有關的部分,其它部分讀者請,自行看原始碼分析。
專案啟動:只需要啟動mall-tiny-sa-token
模組的部分即可。
啟動所需:啟動mysql5的服務,建立資料庫,並匯入表(sql檔案位置在,專案同級目錄的document
資料夾裡)。
ps:記得修改資料庫連線的設定資訊。
在pom檔案
中匯入sa-token的相關依賴。
在application.yml
中新增sa-token的相關設定,專案支援前後端分離專案,關閉從 cookie 中讀取 token,改為從 head 中讀取 token的設定。
對於處理未登入的、沒有許可權的、沒有角色的異常,需要全域性處理一下。
拿登入來做個小例子:由於未登入狀態下存取介面,Sa-Token 會丟擲NotLoginException
異常,此時會根據自定義的返回資訊,返回狀態碼401
和響應資訊未提供token
(例外處理的結果資訊)。
有兩個使用者,admin
使用者具有ROLE_ADMIN
角色,macro
使用者具有ROLE_USER
角色。
ps:模擬資料庫兩張表的關聯資訊是根據id來關聯的,也就是給使用者分配角色。
在管理系統中,除了登入介面,基本上都需要登入認證,在 sa-token中使用路由攔截鑑權是最方便的,也就是說給sa-token設定攔截器,實現WebMvcConfigurer
介面,設定黑白名單。
ps:自定義的白名單是從application.yml
檔案中獲取到的資訊。
1.首先是控制層, 在UmsAdminController
中新增一個登入介面login
。
2.接著業務層, 在UmsAdminServiceImpl
新增登入的具體邏輯,先驗證密碼,然後呼叫StpUtil.login(adminUser.getId())
即可實現登入。
方式一:使用Postman
測試
方式二:使用swagger
介面檔案測試(建議使用,以及編寫好,直接存取即可測試,存取地址為: Swagger UI ),由於已經拿到token,就不做重複測試了,直接測另一個介面,查詢當前登入狀態的介面。
緊接上文,我來實現一下吧!對於角色認證也就是定義好一套存取介面的規則,比如ROLE-ADMIN
角色可以存取/brand
下的所有資源,而ROLE_USER
角色只能存取/brand/listAll
下的資源。
設定全域性異常:見副標題3.1.3
有所描述,不做過多陳訴。
當用戶不是被允許的角色存取時,Sa-Token會丟擲NotRoleException
異常。
擴充套件 sa-token的StpInterface
介面,重寫方法來返回使用者的角色名稱和角色許可權列表。
由於StpInterfaceImpl
實現了StpInterface
介面,重寫了裡面的方法。所以在SaTokenConfig
的組態檔中的StpUtil.checkRole("ROLE_ADMIN")
才能匹配到模擬的資料庫的角色資訊。許可權資訊也是同理,不一一列舉了。
在攔截器中設定路由規則,ROLE_ADMIN
角色可以存取所有路徑,而ROLE_USER
只能存取/brand/listAll
路徑。
對於 admin
使用者具有ROLE_ADMIN
角色,macro
使用者具有ROLE_USER
角色 。
admin
賬號存取/brand/{id}
介面可以正常存取macro
賬號存取/brand/{id}
介面無法正常存取,返回code
為403
這裡就不對admin進行測試展示了,下方是對macro使用者
進行測試,檢視沒有許可權的效果。
當給角色分配好許可權,然後給使用者分配好角色後,使用者就擁有了這些許可權。
對於許可權認證,也可以為每個介面分配不同的許可權,擁有該許可權的使用者就可以存取該介面。
設定全域性異常:見副標題3.1.3
有所描述,不做過多陳訴。
使用者無許可權存取時,Sa-Token 會丟擲NotPermissionException
異常。
給攔截器設定路由規則,admin
使用者可以存取所有路徑,而macro
使用者只有讀取的許可權,沒有寫、改、刪的許可權。
對於 admin
使用者可以存取所有路徑,而macro
使用者只有讀取的許可權,沒有寫、改、刪的許可權。
admin
賬號存取/brand/delete
介面可以正常存取macro
賬號存取/brand/delete
無法正常存取,返回code
為403
這裡就不對admin進行測試展示了,下方是對macro使用者
進行測試,檢視沒有許可權的效果。
本文是有我先從實際專案中獲取需求,從而對SpringSecurity
和Oath2
的學習,結合原始碼來學習,到另一個專案由於鑑權已經部署在不同的ip,專案使用呼叫即可,專案中使用了 Sa-Token 是一個輕量級 Java 許可權認證框架 ,看官網是看的明白,但是不懂如何入手,就有了此文,從mall
開源專案中學習sa-token,感覺收穫頗深,希望這篇文章對你們也會有所幫助。
後續我也會結合該框架學習一下其他的技術棧。
七夕~盈若安好,便是晴天