SpringSecurity-日常踩坑,修改session中的用戶信息。


之前寫過一篇關於SpringSecurity登陸的簡單實現,見 https://www.cnblogs.com/ealenxie/p/9293768.html

在實際使用的時候可能會遇到如下場景 : 

遇到場景 : 前端通過session獲取當前用戶信息,當前用戶信息在前端頁面發生了改變時(比如用戶update了自己的email屬性);可能數據庫里面已經update了,而程序沒有重啟或者用戶沒有重新登陸,則session中的值是不會發生改變的,即驗證的用戶信息也是不變的,前端顯示也並不會更新。

一般spring security在認證后,security會把一個SecurityContextImpl對象存儲到session中,此對象中有當前用戶的各種資料。

基本思路 : 我們要改變SpringSecurity 的session中用戶信息,本質上就是要改SecurityContextImpl對象中的用戶信息。

1.  SecurityContextImpl中只有兩個基本業務方法,getAuthentication()  / setAuthentication() ,這兩個方法是為了獲取/設置 Authentication 對象 ,Authentication 是一個接口。

2 . 用戶認證最核心的部分是接口 Authentication接口,它有兩個最重要的方法 getPrincipal() / setPrincipal(),可獲取被驗證的用戶的身份 / 可用於設置被驗證的用戶的身份。

3 . Authentication有一個基本的實現類,UsernamePasswordAuthenticationToken,我們只要將它初始化出來,並將我們更新的用戶信息賦上去,即可完成修改session的用戶信息。

//1.從HttpServletRequest中獲取SecurityContextImpl對象
SecurityContextImpl securityContextImpl = (SecurityContextImpl) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
//2.從SecurityContextImpl中獲取Authentication對象
Authentication authentication = securityContextImpl.getAuthentication();
//3.初始化UsernamePasswordAuthenticationToken實例 ,這里的參數user就是我們要更新的用戶信息
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, authentication.getCredentials());
auth.setDetails(authentication.getDetails());
//4.重新設置SecurityContextImpl對象的Authentication
securityContextImpl.setAuthentication(auth);

 


免責聲明!

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



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