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

相关文章
相关标签/搜索