之前寫過一篇關於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);
