SecurityContextHolder.getContext().getAuthentication()為null的情況


原理:

UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication() .getPrincipal();

如果想用上面的代碼獲得當前用戶,必須在spring security過濾器執行中執行,否則在過濾鏈執行完時org.springframework.security.web.context.SecurityContextPersistenceFilter類會

調用SecurityContextHolder.clearContext();而把SecurityContextHolder清空,所以會得到null。    經過spring security認證后,

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

網上的情況:

1.關鍵就是要把filters="none" 變化為相應的權限如access="permitAll"(必須設置<http auto-config="true" use-expressions="true">,否則會提示permitAll找不到),或者access = "IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED",當然security 3.1是要修改<http pattern="/login" security="none"/>這類的

原文:https://blog.csdn.net/softwarehe/article/details/7710707/


2.SecurityContextImpl securityContextImpl = (SecurityContextImpl) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT");

 

3.刪除 <intercept-url pattern="/aaa/bbb*" filters="none"/> 類似配置

我的情況:

我給靜態資源js配置了<security:http pattern="/js/**" security="none"/>

又給action加了@Namespace("/js/xjgzjs") 注解

所以在訪問這個action時,沒有經過spring security過濾器,SecurityContextHolder清空,所以會得到null。

把@Namespace("/js/xjgzjs")改為@Namespace("/ry/xjgzjs")即可。

 


免責聲明!

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



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