舊的Spring Security OAuth2停止維護已經有一段時間了,99%的Spring Cloud微服務專案還在使用這些舊的體系,嚴重青黃不接,很多同學都在尋找新的解決方案,甚至還有念念不忘密碼模式的,胖哥也在前面寫了一篇解決思路的文章,好像還是不過癮,今天看到這篇文章的同學有福了,問題將在這里得到解決,
方案
目前這應該是Spring生態中最新的解決方案,沒有之一,先看下流程,微服務無關的其它的組件這里先屏蔽了,剩下圖的幾個組件:

詳細流程為:
-
①用戶向網關請求登錄或者通過網關請求資源服務器的資源,
-
②網關發現用戶沒有授權發起基于OAuth2授權碼的OIDC流程,向授權服務器Id Server發起授權請求,
-
③授權服務器Id Server收到授權請求重定向到用戶登錄頁面要求用戶登錄認證,以發起授權,
-
④用戶輸入用戶名密碼進行登錄認證,
-
⑤Id Server授權服務器處理用戶認證并重定向到網關約定的OAuth2 Redirect URI,這個程序屬于標準的OIDC授權碼流程,
-
⑥網關獲得AccessToken和IdToken:
- 如果最初發起的是登錄就重定向到
/, - 如果最初發起的是請求資源服務器資源就令牌中繼重定向到對應的資源,
- 如果最初發起的是登錄就重定向到
-
資源服務器通過⑦⑧兩個鏈路回應用戶的請求,
請注意,上述流程中生成的AccessToken和IdToken不允許提供給用戶側,否則會引起中間人攻擊,默認提供的是一個cookie策略,大部分情況下這種策略是夠用的,如果你需要自定義必須深刻了解其機制,你可以通過我的Spring Security OAuth2專欄進行學習,
具體實作
根據上面的方案,我們需要三個應用,分別是網關Spring Cloud Gateway應用、資源服務器應用Resource Server和OAuth2授權服務器Id Server,
Spring Cloud Gateway
Spring Cloud Gateway 應用,埠8080,它不僅僅是一個網關還是一個在授權服務器Id Server注冊的OAuth2客戶端,通過Id Server你可以在一分鐘內完成配置,它需要配置到資源服務器的路由規則和令牌中繼功能,核心配置為:
spring:
application:
name: gateway
security:
oauth2:
client:
registration:
# 這里為客戶端名稱可自行更改
gatewayclient:
client-id: e4da4a32-592b-46f0-ae1d-784310e88423
# 密碼為注冊客戶端時的密碼
client-secret: secret
# 只能選擇一個
redirect-uri: http://127.0.0.1:8080/login/oauth2/code/gatewayclient
# 其它兩種方式為refresh_token,client_credentials
authorization-grant-type: authorization_code
client-authentication-method: client_secret_basic
scope: message.write,userinfo,message.read,openid
provider:
gatewayclient:
# 要保證授權服務器地址可以被客戶端訪問
issuer-uri: http://localhost:9000
cloud:
gateway:
routes:
- id: resource-server
uri: http://127.0.0.1:8084
predicates:
- Path=/res/**
filters:
- TokenRelay
Resource Server
資源服務器就是我們平常撰寫的業務介面的服務器,埠這里定義為8084,它需要集成Spring Security及其Resource Server組件,它要負責定義資源介面的訪問權限,例如:
// 只有message.read才有資格訪問資源/res/foo
httpSecurity.authorizeRequests()
.antMatchers("/res/foo").hasAnyAuthority("SCOPE_message.read")
另外它還要和授權服務器Id Server通訊獲取AccessToken的解碼公鑰:
spring:
security:
oauth2:
resourceserver:
jwt:
jwk-set-uri: http://localhost:9000/oauth2/jwks
獲取解碼公鑰的原理在我的Spring Security OAuth2專欄有詳細介紹,這里不再贅述,
Id Server
倉庫地址:https://github.com/NotFound403/id-server 歡迎star,歡迎貢獻,
Id Server是一個基于Spring Authorization Server的開源的授權服務器,它大大降低OAuth2授權服務器的學習使用難度,提供UI控制臺,動態權限控制,方便OAuth2客戶端管理,可一鍵生成Spring Security配置,開箱即用,少量配置修改就可部署,代碼開源,方便二次開發,支持OAuth2四種客戶端認證方式和三種授權模式,它是目前Spring安全生態中重要的組成部分,也是未來的技術發展趨勢,更多資訊請參閱Id Server專案倉庫的介紹,
Id Server在本文扮演的是OAuth2授權服務器的角色,負責對授權請求進行處理,維護客戶端注冊資訊,授權用戶資訊,后續會加入IDP支持,各種三方登錄的用戶也可以動態在這里進行登錄,就像這樣:

根據業務需要第三方OAuth2授權登錄也能優雅的接入,當然,接入的登錄方式需要OIDC或者OAuth2的支持,
DEMO以及使用方法
上述完整DEMO在Id Server的倉庫中的samples下,使用方法:
- 拉取Id Server專案并加載依賴,
- 在IntelliJ IDEA中依次單獨對
samples檔案夾下的所有專案的pom.xml進行右鍵選單選中Add As Maven Project,這一步很重要, - 依次啟動Id Server、gateway、resource-server三個專案,
測驗登錄
- 瀏覽器訪問
http://127.0.0.1:8080/login,點擊http://localhost:9000, - 輸入用戶名密碼
user/user, - 能查看到認證資訊就證明成功了,再次重申,在生產中該資訊十分敏感,不應該直接對前端暴露,
- 瀏覽器訪問
http://127.0.0.1:8080/res/foo,可以訪問到資源服務器的資源,
另一種測驗
關閉瀏覽器重新打開,瀏覽器訪問http://127.0.0.1:8080/res/foo,你看看會發生什么?
總結
通過OAuth2客戶端、Spring Cloud Gateway、OAuth2授權服務器、OAuth2資源服務器的聯動,你會發現授權碼模式也可以實作完整的微服務認證授權,而且比密碼模式更加安全,后續Id Server實作了聯合登錄之后,其它第三方登錄也可以無縫集成進來,多多關注,更多先進的黑科技等著你,
關注公眾號:Felordcn 獲取更多資訊
個人博客:https://felord.cn
|
博主:碼農小胖哥 出處:felord.cn 本文著作權歸原作者所有,不可商用,轉載需要宣告出處,否則保留追究法律責任的權利,如果文中有什么錯誤,歡迎指出,以免更多的人被誤導, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474809.html
標籤:Java
下一篇:Mybatis原始碼解讀-插件
