原理:
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")即可。