SecurityContextHolder.getContext().getAuthentication()爲null的狀況

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

相關文章
相關標籤/搜索