一、傳統Session認證
1、認證過程
用戶向伺服器發送用戶名和密碼。伺服器驗證後在當前對話(session)保存相關數據。伺服器返回sessionId,寫入客戶端 Cookie。客戶端每次請求,需要通過 Cookie,將 sessionId 回傳伺服器。伺服器收到 sessionId,驗證客戶端。2、存在問題
session保存在服務端,客戶端訪問高並發時,服務端壓力大。
擴展性差,伺服器集群,就需要 session 數據共享。
二、JWT簡介
JWT(全稱:JSON Web Token),在基於HTTP通信過程中,進行身份認證。
1、認證流程
客戶端通過用戶名和密碼登錄伺服器;服務端對客戶端身份進行驗證;伺服器認證以後,生成一個 JSON 對象,發回客戶端;客戶端與服務端通信的時候,都要發回這個 JSON 對象;服務端解析該JSON對象,獲取用戶身份;服務端可以不必存儲該JSON(Token)對象,身份信息都可以解析出來。
2、JWT結構
頭部(header) 聲明類型以及加密算法;負載(payload) 攜帶一些用戶身份信息;籤名(signature) 籤名信息;3、JWT使用方式
通常推薦的做法是客戶端在 HTTP 請求的頭信息Authorization欄位裡面。
Authorization: Bearer <token>
三、Shiro簡介
1、基礎概念
Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼和會話管理。作為一款安全框架Shiro的設計相當巧妙。Shiro的應用不依賴任何容器,它不僅可以在JavaEE下使用,還可以應用在JavaSE環境中。
2、核心角色
Subject:認證主體代表當前系統的使用者,就是用戶,在Shiro的認證中,認證主體通常就是userName和passWord,或者其他用戶相關的唯一標識。
SecurityManager:安全管理器Shiro架構中最核心的組件,通過它可以協調其他組件完成用戶認證和授權。實際上,SecurityManager就是Shiro框架的控制器。
Realm:域對象定義了訪問數據的方式,用來連接不同的數據源,如:關係資料庫,配置文件等等。
3、核心理念
Shiro自己不維護用戶和權限,通過Subject用戶主體和Realm域對象的注入,完成用戶的認證和授權。
四、Security簡介
1、基礎概念
Spring Security是一個能夠為基於Spring的企業應用系統提供聲明式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring的IOC,DI,AOP(面向切面編程)功能,為應用系統提供聲明式的安全訪問控制功能,減少了為安全控制編寫大量重複代碼的工作。
2、核心API解讀
SecurityContextHolder最基本的對象,保存著當前會話用戶認證,權限,鑑權等核心數據。SecurityContextHolder默認使用ThreadLocal策略來存儲認證信息,與線程綁定的策略。用戶退出時,自動清除當前線程的認證信息。
AuthenticationgetAuthorities,權限列表,通常是代表權限的字符串集合;getCredentials,密碼,認證之後會移出,來保證安全性;getDetails,請求的細節參數;getPrincipal, 核心身份信息,一般返回UserDetails的實現類;UserDetails封裝了用戶的詳細的信息。
UserDetailsService實現該接口,自定義用戶認證流程,通常讀取資料庫,對比用戶的登錄信息,完成認證,授權。
AuthenticationManager認證流程頂級接口。可以通過實現AuthenticationManager接口來自定義自己的認證方式,Spring提供了一個默認的實現,ProviderManager。
五、OAuth2認證機制
1、OAuth2機制簡介
OAuth2關注客戶端開發者的簡易性。要麼通過組織在資源擁有者和HTTP服務商之間的被批准的交互動作代表用戶,要麼允許第三方應用代表用戶獲得訪問的權限。同時為Web應用,桌面應用和手機,和起居室設備提供專門的認證流程。 OAuth開放授權是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一應用服務上存儲的資源,而無需將用戶名和密碼提供給第三方應用。
例如經典的場景:
用戶登錄某第三方網站,可以選擇不註冊;該第三方網站提供其他登錄方式:QQ或者微信;用戶使用QQ或者微信授權登錄該網站;該網站獲取QQ或者微信的登錄信息,頭像和暱稱;該流程涉及如下幾個角色:
Third-Application: 第三方應用,即用戶不需註冊的網站;Resource-Owner: 資源持有者,一般就是用戶自身,用戶擁有微信或QQ登錄的權限;Authorization-server: 認證伺服器,服務提供商專門用來處理認證的伺服器,即對微信或者QQ帳號識別的服務;Resource-server: 資源伺服器,具體資源的存儲服務,這裡是指用戶的頭像和暱稱的存儲服務;User Agent: 用戶代理,一般就是指的瀏覽器;Http Service: 服務提供者,也就是持有Resource Server的存在方;2、模式圖解
Client理解為第三方應用,可以看到Oauth的基本流程如下:
Client向資源持有者請求獲取資源,資源持有者授權第三方應用一個許可證,第三方應用將該許可證發送到認證伺服器進行認證,如果認證成功,返回一Token給Client,第三方應用使用該access token到資源伺服器處獲取該access token對應的資源。