spring security 單點登錄 ssm框架 sso


security登錄的攔截器為 UsernamePasswordAuthenticationFilter ,其中這里默認登錄訪問接口為/login,且為post請求方式  

 

 

 , attemptAuthentication ( ) 這個方法就是認證方法,最終會將客戶端傳來的username 和 password 封裝成,UsernamePasswordAuthenticationToken 對象,該對象本質也是Authentication對象,

因為UsernamePasswordAuthenticationToken繼承了AbstractAuthenticationToken,而AbstractAuthenticationToken實現了Authentication

 

 

 在UsernamePasswordAuthenticationFilter 的認證方法最后一行代碼為 this.getAuthenticationManager().authenticate(authRequest);,這里就是需要傳入一個Authentication對象及其子類,這也是我為什么解釋

UsernamePasswordAuthenticationToken 本質也是Authentication對象的原因了,下面我們點進去看看,會進入一個AuthenticationManager的接口中,這個接口的實現類ProviderManager提供了具體的認證方法,並最終確定
由哪種provider來處理該方式的認證,當前的認證是有AbstractUserDetailsAuthenticationProvider來處理的,那么接着往下看

 

 

 

 

 

 下面我們先看看 retrieveUser( )是如何通過用戶名來查找數據庫的,這個方法是由DaoAuthenticationProvider實現類來具體實現的,下面代碼分析

 

 

 我們自己定義的UserServiceImpl實現重現 loadUserByUsername( ) 方法,如下

 

 

 用戶查到之后我們需要判斷用戶的狀態,下面接着看 preAuthenticationChecks.check(user);

 

 

 

 

 

 當用戶狀態都符合,且為一個正常用戶時,security就會進行密碼校驗,下面接着看this.additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken)authentication);

 

 

 

 

 到此就完成了所有的認證,這時security就會把認證后的對象放入securityContext域中,重新生成一個UsernamePasswordAuthenticationToken對象,設置它的認證狀態為true,並跳轉我們在配置文件中或配置類中指定成功后要跳轉的頁面或接口

default-target-url="/index.jsp"

 

 

 

 

 認證成功后的業務邏輯處理

 

 當我們選擇了remeberMe時,security會生成一個token放入到客戶端的cookie中

 

 

 

如果配置文件或配置類中開啟remember-me,
<security:remember-me token-validity-seconds="60"></security:remember-me> ,就會判斷remember-me 有沒有值,而且值的要求是否符合security的要求,默認remember是不開啟的

 

 如果選擇了remember-me則由TokenBasedRememberMeServices這個類去處理, 生成remember-me的token 后,可以選擇直接設置cookie返回給客戶端

 

 

 

 

 也可以選擇持久化token,同時設置cookie響應到客戶端,這是由 PersistentTokenBasedRememberMeServices所實現

 

 

 

 

 

 

 如果我們沒有選擇remember-me ,將由NullRememberMeServices來直接處理響應

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM