Spring Security3使用SecurityContextHolder取不到用户

在Java中取用户信息的代码:

1
2
3
4
5
6
7
8
9
10
11
Object principal = SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
username = ((UserDetails) principal).getUsername();
Iterator it = ((UserDetails) principal).getAuthorities().iterator();
String authority = "";
while (it.hasNext()) {
authority = ((GrantedAuthority) it.next()).getAuthority();
System.out.println("Authority:" + authority);
}
}

spring security 3的配置示例:applicationContext-security.xml

1
2
3
4
5
6
7
8
9
<intercept-url pattern="/dwr/**" filters="none"/>  
<intercept-url pattern="/css/**" filters="none"/>
<intercept-url pattern="/images/**" filters="none"/>
<intercept-url pattern="/scripts/**" filters="none"/>
<intercept-url pattern="/index.html*" filters="none"/>
<intercept-url pattern="/mydefault/**" filters="none"/>
<!--
<intercept-url pattern="/admin/**" filters="none"/>
-->

当你的servlet、action或Spring MVC的C(Control)相对应的url是以/mydefalut/开头,如果你要使用SecurityContextHolder获取用户信息,那么我告诉你,你想都别想。绝对是不可能的!

当你的servlet、action或Spring MVC的C相对应的url是以/admin/开头(或者其它没有没有配置filter为none的url),如果你要使用SecurityContextHolder获取用户信息,那么我想你是没有问题的。

产生原因:

1
2
3
4
5
6
7
8
9
<filter>  
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Spring Security的工作原理:Spring Security就是一个filter,如果你把Spring Security的配置文件中某个url-pattern 的filter配置为none,那么与这个url相关的请求,Spring Security是不会干活滴!