Spring Security認證簡介

2022-09-03 01:12:11 字數 2277 閱讀 8959

使用者使用使用者名稱和密碼進行登入。

spring security 將獲取到的使用者名稱和密碼封裝成乙個實現了 authentication 介面的 usernamepasswordauthenticationtoken。

將上述產生的 token 物件傳遞給 authenticationmanager 進行登入認證。

authenticationmanager 認證成功後將會返回乙個封裝了使用者許可權等資訊的 authentication 物件。

通過呼叫 securitycontextholder.getcontext().setauthentication(...) 將 authenticationmanager 返回的 authentication 物件賦予給當前的 securitycontext。

上述介紹的就是 spring security 的認證過程。在認證成功後,使用者就可以繼續操作去訪問其它受保護的資源了,但是在訪問的時候將會使用儲存在 securitycontext 中的 authentication 物件進行相關的許可權鑑定。

如果使用者直接訪問登入頁面,那麼認證過程跟上節描述的基本一致,只是在認證完成後將跳轉到指定的成功頁面,預設是應用的根路徑。如果使用者直接訪問乙個受保護的資源,那麼認證過程將如下:

引導使用者進行登入,通常是重定向到乙個基於 form 表單進行登入的頁面,具體視配置而定。

使用者輸入使用者名稱和密碼後請求認證,後台還是會像上節描述的那樣獲取使用者名稱和密碼封裝成乙個 usernamepasswordauthenticationtoken 物件,然後把它傳遞給 authenticationmanager 進行認證。

如果認證失敗將繼續執行步驟 1,如果認證成功則會儲存返回的 authentication 到 securitycontext,然後缺省會將使用者重定向到之前訪問的頁面。

使用者登入認證成功後再次訪問之前受保護的資源時就會對使用者進行許可權鑑定,如不存在對應的訪問許可權,則會返回 403 錯誤碼。

在上述步驟中將有很多不同的類參與,但其中主要的參與者是 exceptiontranslationfilter。

exceptiontranslationfilter 是用來處理來自 abstractsecurityinterceptor 丟擲的 authenticationexception 和 accessdeniedexception 的。abstractsecurityinterceptor 是 spring security 用於攔截請求進行許可權鑑定的,其擁有兩個具體的子類,攔截方法呼叫的 methodsecurityinterceptor 和攔截 url 請求的 filtersecurityinterceptor。當 exceptiontranslationfilter 捕獲到的是 authenticationexception 時將呼叫 authenticationentrypoint 引導使用者進行登入;如果捕獲的是 accessdeniedexception,但是使用者還沒有通過認證,則呼叫 authenticationentrypoint 引導使用者進行登入認證,否則將返回乙個表示不存在對應許可權的 403 錯誤碼。

可能你早就有這麼乙個疑問了,既然 securitycontext 是存放在 threadlocal 中的,而且在每次許可權鑑定的時候都是從 threadlocal 中獲取 securitycontext 中對應的 authentication 所擁有的許可權,並且不同的 request 是不同的執行緒,為什麼每次都可以從 threadlocal 中獲取到當前使用者對應的 securitycontext 呢?在 web 應用中這是通過 securitycontextpersistentfilter 實現的,預設情況下其會在每次請求開始的時候從 session 中獲取 securitycontext,然後把它設定給 securitycontextholder,在請求結束後又會將 securitycontextholder 所持有的 securitycontext 儲存在 session 中,並且清除 securitycontextholder 所持有的 securitycontext。這樣當我們第一次訪問系統的時候,securitycontextholder 所持有的 securitycontext 肯定是空的,待我們登入成功後,securitycontextholder 所持有的 securitycontext 就不是空的了,且包含有認證成功的 authentication 物件,待請求結束後我們就會將 securitycontext 存在 session 中,等到下次請求的時候就可以從 session 中獲取到該 securitycontext 並把它賦予給 securitycontextholder 了,由於 securitycontextholder 已經持有認證過的 authentication 物件了,所以下次訪問的時候也就不再需要進行登入認證了。

SpringSecurity自定義登入認證

spring security預設的登入表單只有username和password,但實際業務中我們可能需要使用其他的字段校驗,因此需要重寫認證部分。springsecurityfilterchain org.springframework.web.filter.delegatingfilterpr...

springsecurity Run As認證服務

zhangxin.security.service.roleservice.loadmenu role user,run as temp zhangxin.security.runasdemo.runasdate.showdate role admin,role run as temp object...

Token Cookie Session的認識了解

token token的意思是 令牌 是使用者身份的驗證方式,最簡單的token組成 uid 使用者唯一的身份標識 time 當前時間的時間戳 sign 簽名,由token的前幾位 雜湊演算法壓縮成一定長的十六進製制字串,可以防止惡意第三方拼接token請求伺服器 還可以把不變的引數也放進token...