【spring Security】Security、oauth、JWT關係梳理
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