SecurityContextPersistenceFilter
让我们来看一下FilterChainProxy所使用的SecurityContextPersistenceFilter如何配置,一个最基本的配置只需要它的bean自身即可:
<bean id="securityContextPersistenceFilter"
class="org.springframework.security.web.context.SecurityContextPersistenceFilter"/>
跟我们之前了解到的一样,这个filter有两个主要的任务,第一,它负责在HTTP请求之中保存SecurityContext内容,并且当请求完毕之后清理SecurityContextHolder;第二,最重要的功能是,清理ThreadLocal局部变量,因为一个线程可能会被代替并被放入线程池中,这样一些用户可以访问到security的内容,这个线程可能会在持有坏的凭证的时候可以继续执行一些操作。
SecurityContextRepository
从Spring Security3.0开始,装载并存储security上线文的任务交给了独立的接口:
public interface SecurityContextRepository {
SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder);
void saveContext(SecurityContext context, HttpServletRequest request,
HttpServletResponse response);
}
HttpRequestResponseHolder是一个与接收的请求和相应对象有关的简单容器,可以用被封装的类来替代他们,返回的内容将被传递到过滤器链。
默认的实现是HttpSessionSecurityContextRepository,它将security上下文保存为HTTPSession属性。这种实现的最重要的配置参数是allowSessionCreation,默认是true,这样当需要一个新的session来保存被认证用户的信息时,就会新创建一个session(当认证已经完成或者security上下文 已经改变时,它不会新 创建一个session)。如果你不希望创建一个新的session,可以将属性设置为false。
<bean id="securityContextPersistenceFilter"
class="org.springframework.security.web.context.SecurityContextPersistenceFilter">
<property name='securityContextRepository'>
<bean class='org.springframework.security.web.context.HttpSessionSecurityContextRepository'>
<property name='allowSessionCreation' value='false' />
</bean>
</property>
</bean>
或者你可以创建一个NullSecurityContextRepository,的实例,一个“null object”的实现,这样即使在请求期间session一被创建,也可以阻止security上下文被存储。
参考资料来自《
Spring Security Reference Documentation(3.1)
》,下载地址:
http://download.csdn.net/detail/u010009900/9169039