Security
Security是spring提供的一個高度自定義的安全框架,為系統提供了安全訪問控制功能。簡化了認證授權及系統安全管理。
Security使用了責任鏈的設計模式,他提供了一個非常長的過濾器鏈完成完成認證、授權、鑒權的相關操作。
oauth
oauth是一套關於認證授權的協議,是一種規范,spring-security-oauth是對oauth規范的一種實現。
oauth保證了訪問資源的安全性以及靈活性。他允許用戶不把某系統的賬號密碼提供給第三方,第三方就能訪問到此用戶該系統上的信息,使第三方應用可以更安全的訪問資源。
oauth流程
oauth在 客戶端 與 資源服務 之間設置了一個 授權層 。使客戶端不能直接訪問 資源服務 ,而需要 客戶端 經過用戶同意授權之后在授權層拿到令牌token,使用token訪問 資源服務 。授權層在頒發token的時候可以指定token的授權范圍以及有效時間。使用token只能訪問規定的范圍內的資源。
流程圖:
(A)客戶端請求用戶授權
(B)用戶同意客戶端的授權請求
(C)客戶端使用用戶授權請求 授權服務器
(D)授權服務器延華智能成功之后頒發令牌 access token
(E)客戶端使用 access token 請求資源服務
(F)資源服務器校驗token做出響應
對於客戶端的授權流程oauth2.0定義了四種授權模式
- 授權碼模式
- 隱式模式
- 密碼模式
- 客戶端模式
授權碼模式
授權碼模式是最嚴密最復雜最安全的授權模式。
前提:
需要在授權服務器上提前定義好客戶端的 客戶端ID(client_id) 、 客戶端秘鑰(client_secret)、回調地址(redirect_uri)、客戶端的授權模式、作用域、資源ID等。
2、客戶端請求授權服務器授權時需要攜帶client_id、client_secret、response_type http://localhost:8080/oauth/authorize?client_id=c123456&client_secret=c123456&response_type=code
3、授權服務器返回登錄頁讓用戶登錄,登錄成功返回授權頁,讓用戶給客戶端授權
5、用戶給與授權之后,授權服務器調用回調地址,返回授權碼 http://localhost:9001/callback?code=j0vvGf
6、客戶端使用授權碼換取token,http://localhost:8080/oauth/token
token校驗有兩種方式:1、配置授權服務器的token校驗的端口,2、配置和授權服務器一樣的TokenStore
隱式模式
用戶登錄授權服務器並對客戶端授權,授權服務器直接返回token,省略了授權碼的過程。
前提:
需要在授權服務器上提前定義好客戶端的 客戶端ID(client_id) 、 客戶端秘鑰(client_secret)、回調地址(redirect_uri)、客戶端的授權模式、作用域、資源ID等。
2、客戶端請求授權服務器授權時需要攜帶client_id、response_type
http://localhost:8080/oauth/authorize?client_id=client-a&response_type=token
3、授權服務器返回登錄頁讓用戶登錄,登錄成功返回授權頁,讓用戶給客戶端授權
5、用戶給與授權之后,授權服務器調用回調地址,返回token
http://localhost:9001/callback#access_token=ede88421-5703-4365-a72e-b5f0b6101704&token_type=bearer&expires_in=42841&scope=all
token校驗有兩種方式:1、配置授權服務器的token校驗的端口,2、配置和授權服務器一樣的TokenStore
密碼模式
密碼模式中需要用戶提供自己的賬號密碼給客戶端,客戶端使用用戶的賬號密碼和client_id client_secret去授權服務器請求token
客戶端模式
客戶端以自己的名義,而不是以用戶的名義 去授權服務器申請token
這個模式中用戶不需要和授權服務器有什么聯系,只需要和客戶端做交互。
JWT
- 是基於token的認證流程的具體實現
- 主要用來生成token,驗證token是否過期以及獲取用戶信息
總結
oauth2.0是規范,使用時是引入了oauth2.0的規范。
JWT是token的實現,做token的生成以及校驗。
Security本身是一套完整的認證和授權解決方案,他是一條很長的過濾器鏈,使用oauth和JWT需要在過濾器鏈中定義oauth和JW他的具體實現。
前后端分離的系統,只需要實現token,做token的頒發和校驗。JWT是token的一種實現方式。
系統需要給第三方系統做授權,就需要實現oauth。
JWT對token的實現可以通過解密獲取用戶信息以及權限信息,簡化oauth的校驗流程。
參考:
oauth授權流程以及實現
https://www.cnblogs.com/hellxz/p/oauth2_process.html
springboot-安全認證security+jwt+OAuth2.0關系梳理
https://blog.csdn.net/shishuai4206/article/details/111504155