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