spring security 3 关于session 会话管理
spring security 3 的官方的文档不是很好找,一般都是spring security 2 (Acegi)的文档较多,但是 3 在 2 的基础上发生了很大变化,其中过滤器的命名使用上就有很大的差异。这是找到的3.0.1 的一个文档地址 http://www.fengfly.com/document/springsecurity3/springsecurity.html(2011.5可用),可以查看过滤器链相关内容,发现不同,下图为3.0+的一个过滤器命名空间表:
Table 2.1. 标准过滤器假名和顺序
auto-config | 假名 | 过滤器类 | 命名空间元素或属性 |
---|---|---|---|
CHANNEL_FILTER | ChannelProcessingFilter |
http/intercept-url@requires-channel |
|
CONCURRENT_SESSION_FILTER | ConcurrentSessionFilter |
session-management/concurrency-control |
|
SECURITY_CONTEXT_FILTER | SecurityContextPersistenceFilter |
http |
|
Y | LOGOUT_FILTER | LogoutFilter |
http/logout |
X509_FILTER | X509AuthenticationFilter |
http/x509 |
|
PRE_AUTH_FILTER | AstractPreAuthenticatedProcessingFilter Subclasses |
N/A | |
CAS_FILTER | CasAuthenticationFilter |
N/A | |
Y | FORM_LOGIN_FILTER | UsernamePasswordAuthenticationFilter |
http/form-login |
Y | BASIC_AUTH_FILTER | BasicAuthenticationFilter |
http/http-basic |
SERVLET_API_SUPPORT_FILTER | SecurityContextHolderAwareFilter |
http/@servlet-api-provision |
|
REMEMBER_ME_FILTER | RememberMeAuthenticationFilter |
http/remember-me |
|
ANONYMOUS_FILTER | SessionManagementFilter |
http/anonymous |
|
SESSION_MANAGEMENT_FILTER | AnonymousAuthenticationFilter |
session-management |
|
EXCEPTION_TRANSLATION_FILTER | ExceptionTranslationFilter |
http |
|
FILTER_SECURITY_INTERCEPTOR | FilterSecurityInterceptor |
http |
|
SWITCH_USER_FILTER | SwitchUserAuthenticationFilter |
N/A |
从上表可以看出,默认的auto-config=‘true’配置中必不包含session-management的过滤器,所以要进行会话管理,需要自己添加过滤器以及监听器。如果你自己扩展了userdetails(实现implements UserDetails)的话,在实现类里注意要重写以下两个方法,否则相同用户登录次数限制将不起作用(原因hashset等结构数据的比较通过hascode()方法)。
/** * 获取当前登录用户详细信息必须重写次方法 */ public int hashCode() { return getUsername().hashCode(); } /** * 获取当前登录用户详细信息必须重写次方法 */ public boolean equals(Object obj) { if (obj instanceof UserDetails) { UserDetails ud = (UserDetails) obj; if (ud.getUsername().equals(this.getUsername())) { return true;} } return false; }
测试相同用户登录限制的时候,用不同浏览器分别访问。