在之前的文章里介紹了SpringBoot和SpringSecurity如何繼承。之后我們需要考慮另外一個問題:當前微服務化也已經是大型網站的趨勢,當我們的項目采用微服務化架構時,往往會出現如下情況:
- 首先,我們會建立一個用戶中心UserCenter,實現用戶的登錄、登出以及其他用戶信息維護等相關功能。
- 然后,我們會有其他業務模塊,比如訂單中心OrderCenter,用來創建、刪除及查看訂單信息,其中創建、刪除訂單需要管理員角色。
那么接下來我們思考我們如何做到統一的用戶認證及鑒權?
毫無疑問的,首先我們需要在UserCenter中引入SpringSecurity,並保證UserCenter可實現用戶登錄、登出以及自身接口的鑒權等功能正常使用。然后OrderCenter只需要接口的鑒權功能,登錄、登出統一交由UserCenter處理。那么問題來了:
用戶的認證及授權是由UserCenter來處理的,OrderCenter怎么能知道到底是哪個用戶登錄並擁有哪些權限呢?
其實很簡單,之前的文章我們有提到SpringBoot+SpringSecurity+SpringSession+Redis來實現UserCenter多點部署時的session共享,上面這個問題也可以通過此方式解決,基本原理:
UserCenter模塊
- 整合SpringSecurity:負責用戶的認證和授權,通過cookie識別是否同一session會話,並將認證通過的用戶及其擁有權限放置到HttpSession中。cookie類似如下:
SESSION=MzkyNDVjNGUtMjIzNi00ZjcwLTljN2QtNjBjZmUxNGI2ZGEy; Path=/; HttpOnly
- 整合SpringSession:負責將HttpSession中的信息放置到Redis中。
- 整合Redis:執行存儲。
OrderCenter模塊
- 整合SpringSecurity:負責調用接口時鑒權。需要保證UserCenter和OrderCenter相同域名,這樣瀏覽器調用OrderCenter接口的時候會攜帶UserCenter完成登錄后的cookie。
- 整合SpringSession:負責根據cookie的session回話標識到Redis中獲取用戶認證信息及其擁有權限。
- 整合Redis:提供存儲查詢。
那么這里挖個坑:如果UserCenter和OrderCenter不是同一個域名呢??
