下面介绍三个过滤器
一:LogoutFiltr
首先定义相应的 LogoutFilter过滤器
<bean id="logoutFilter" class="org.springframework.security.ui.logout.LogoutFilter"> <constructor-arg value="/index.jsp"/> <constructor-arg> <list> <ref local="rememberMeFilter"/> <bean class="org.springframework.security.ui.logout.SecurityContextLogoutHandler"></bean> </list> </constructor-arg> </bean>
第一个参数指向退出成功后指向的页面。第二个参数是一个LogoutHandler类型数组,如果没有启动自动登入功能,<ref local="rememberMeFilter"/>不需要添加。
接着把logoutFilter放到FilterChainProxy中去,位置是在httpSessionContextIntegrationFilter之后,
最后把logout 链接的URL设置为:“/j_spring_security_logout”。通过配置可以更改。
当请求到达LogoutFilter过滤器时,如果HttpServletRequest请求路径中包含j_spring_security_logout时,会进行退出处理,
//判断URL中是否有/j_spring_security_logout if (requiresLogout(request, response)) { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (logger.isDebugEnabled()) { logger.debug("Logging out user '" + auth + "' and redirecting to logout page"); }
退出系统的代码逻辑由LogoutHandler集合提供,Acegi只提供两个类实现了LogoutHandler接口。
SecurityContextLogoutHandler负责销毁session
如果启动自动登入功能,TokenBasedRememberMeServices负责销毁存储在浏览器中的cookie
二:RememberMeProcessingFilter
实现自动登入需要四个步骤:
1: 配置RememberMeProcessingFilter,
<bean id="rememberMeFilter" class="org.springframework.security.ui.rememberme.RememberMeProcessingFilter"> <property name="authenticationManager" ref="authenticationManager"/> <property name="rememberMeServices" ref="rememberMeServices"/> </bean> <bean id="rememberMeServices" class="org.springframework.security.ui.rememberme.TokenBasedRememberMeServices"> <property name="userDetailsService" ref="userDetailsService"/> <property name="key" value="changeThis"/> <property name="alwaysRemember" value="true"/> </bean>
如果SecurityContextHolder.getContext().getAuthentication()为空就尝试进行自动登入,
2:把rememberMeFilter添加到FilterChainProxy定义中,放在basicProcessingFilter后面。
3:把RememberMeAuthenticationProvider认提供者放到认证管理器中
4:把rememberMeServices暴露给basicProcessingFilter