原理:web
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication() .getPrincipal();spring
若是想用上面的代碼得到當前用戶,必須在spring security過濾器執行中執行,不然在過濾鏈執行完時org.springframework.security.web.context.SecurityContextPersistenceFilter類會express
調用SecurityContextHolder.clearContext();而把SecurityContextHolder清空,因此會獲得null。 通過spring security認證後,session
security會把一個SecurityContextImpl對象存儲到session中,此對象中有當前用戶的各類資料。url
網上的狀況:spa
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"/>這類的.net
原文:https://blog.csdn.net/softwarehe/article/details/7710707/對象
2.SecurityContextImpl securityContextImpl = (SecurityContextImpl) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT");blog
3.刪除 <intercept-url pattern="/aaa/bbb*" filters="none"/> 相似配置ip
個人狀況:
我給靜態資源js配置了<security:http pattern="/js/**" security="none"/>
又給action加了@Namespace("/js/xjgzjs") 註解
因此在訪問這個action時,沒有通過spring security過濾器,SecurityContextHolder清空,因此會獲得null。
把@Namespace("/js/xjgzjs")改成@Namespace("/ry/xjgzjs")便可。