在web.xml中的配置
web.xml中配置了:
1 | <filter> |
理解 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 | public final class DefaultSecurityFilterChain implements SecurityFilterChain { |
我们在通过配置文件配置了之后,干的事情其实就是:最终获得list集合,也就是整个springsecurity框架在运行过程中所需要的默认的核心过滤器filter。它把这些获取到,一个个加载执行了。
总结
一个名称 SpringSecurityFilterChain,借助于 Spring 的 IOC 容器,完成了 DelegatingFilterProxy 到 FilterChainProxy 的连接,并借助于 FilterChainProxy 内部维护的 List 中的某一个 SecurityFilterChain 来完成最终的过滤。
- 这个过滤器是我们通过xml配置好的过滤器,配置好后会加入到ioc容器中。
- 容器里这个过滤器的名称是固定的,就是springSecurityFilterChain。
为什么DelegatingFilterProxy
的filter-name
必须是springSecurityFilterChain
?
FilterChainProxy是spring在解析配置文件时装配到上下文中,并且beanName为springSecurityFilterChain
。因此在web.xml中需要配置filter-name为springSecurityFilterChain
。
在spring-security.xml中的配置
规范了哪些路径需要拦截、跳转页面等等。