SpringSecurity源码--springSecurityFilterChain

在web.xml中的配置

web.xml中配置了:

1
2
3
4
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</fiter>

理解 SpringSecurityFilterChain 的工作流程必须搞懂三个类:
org.springframework.web.filter.DelegatingFilterProxy
org.springframework.security.web.FilterChainProxy
org.springframework.security.web.SecurityFilterChain

springSecurityFilterChain的类型其实是FilterChainProxy。但是真正实施过滤的类,是它内部维护

DelegatingFilterProxy

DelegatingFilterProxy 是 SpringSecurity 的“门面”,属于Spring Web 包中的类,并不是 SpringSecurity 中的类。因为Spring希望将侵入性降到最低,所以委托这个代理类来代理真正的SpringSecurityFilterChain【spring安全过滤链】。

DelegatingFilterProxy 实现了 Filter 接口,所以可以作为一个java web的标准过滤器,职责也很简单:负责调用真正的SpringSecurityFilterChain。

阅读DelegatingFilterProxy类源码可以发现:整个逻辑就是为了调用private volatile Filter delegate;
可以看到,DelegatingFilterProxy尝试去容器中获取名为 targetBeanName 的类,而targetBeanName 的默认值就是Filter的名称,也就是SpringSecurityFilterChain
所以,DelegatingFilterProxy 只是名称和 targetBeanName 叫 springSecurityFilterChain。真正容器中的Bean(name=”springSecurityFilterChain”) 其实另有其人。

FilterChainProxy和SecurityFilterChain

FilterChainProxy并不是真正实施过滤的类,它内部维护了一个SecurityFilterChain,这个过滤器链才是请求真正对应的过滤器链。同一个Spring环境下,可能同时存在多个安全过滤器链,需要用matches()匹配。每个请求最多只能经过一个SecurityFilterChain。

1
2
3
4
5
6
7
8
9
10
11
12
public final class DefaultSecurityFilterChain implements SecurityFilterChain {
private final RequestMatcher requestMatcher;
private final List<Filter> filters;

public List<Filter> getFilters() {
return filters;
}

public boolean matches(HttpServletRequest request) {
return requestMatcher.matches(request);
}
}

我们在通过配置文件配置了之后,干的事情其实就是:最终获得list集合,也就是整个springsecurity框架在运行过程中所需要的默认的核心过滤器filter。它把这些获取到,一个个加载执行了。

总结

一个名称 SpringSecurityFilterChain,借助于 Spring 的 IOC 容器,完成了 DelegatingFilterProxy 到 FilterChainProxy 的连接,并借助于 FilterChainProxy 内部维护的 List 中的某一个 SecurityFilterChain 来完成最终的过滤。

  • 这个过滤器是我们通过xml配置好的过滤器,配置好后会加入到ioc容器中。
  • 容器里这个过滤器的名称是固定的,就是springSecurityFilterChain。

为什么DelegatingFilterProxyfilter-name必须是springSecurityFilterChain

FilterChainProxy是spring在解析配置文件时装配到上下文中,并且beanName为springSecurityFilterChain。因此在web.xml中需要配置filter-name为springSecurityFilterChain

在spring-security.xml中的配置

规范了哪些路径需要拦截、跳转页面等等。