Spring Security之 spring-Security.xml 源码分析(四)
springSecurityFilterChain
是Sping容器
初始化的一个bean
,本篇文章介绍Sping容器
是如何初始化springSecurityFilterChain
spring-security.xml
中http
是一个自定义的标签
-
http标签是自定义标签,我们可以在spring-security-config包中查看,发现
http\://www.springframework.org/schema/security
这个标签是在org.springframework.security.config.SecurityNamespaceHandler
这个类帮我们去解析的,此处的名称空间http\://www.springframework.org/schema/security
和spring-security.xml
约束中的名称空间是一样的
-
打开
SecurityNamespaceHandler
这个实现类,看到init()
方法,它是一个初始化方法,执行一个loadParsers()
方法,loadParsers()
方法帮我们去加载了一些解析器
-
在
loadParsers()
方法看到HTTP
的解析器HttpSecurityBeanDefinitionParser()
-
在
HttpSecurityBeanDefinitionParser()
这个类中parse(Element element, ParserContext pc)
方法去执行解析
-
parse(Element element, ParserContext pc)
方法中通过的registerFilterChainProxyIfNecessary(pc, pc.extractSource(element))
这个方法是用于注册FilterChainProxy
-
我们来看一下
registerFilterChainProxyIfNecessary(pc, pc.extractSource(element))
这个方法,它在最下面把SPRING_SECURITY_FILTER_CHAIN)
给注册了
-
我们打开
SPRING_SECURITY_FILTER_CHAIN)
,发现SPRING_SECURITY_FILTER_CHAIN)
实际上就是springSecurityFilterChain
这个名字,所以registerFilterChainProxyIfNecessary(pc, pc.extractSource(element))
这个方法就是用来给Spring容器
创建我们在web.xml
看到的springSecurityFilterChain
-
现在我们再回到
parse(Element element, ParserContext pc)
方法中,找到filterChains.add(createFilterChain(element, pc))
这个方法
-
打开
filterChains.add(createFilterChain(element, pc))
方法中的createFilterChain(element, pc)
这个方法,找到new AuthenticationConfigBuilder(element, forceAutoConfig, pc, httpBldr.getSessionCreationPolicy()
,查看在new
的过程中执行了什么
-
通过
new AuthenticationConfigBuilder(element, forceAutoConfig, pc, httpBldr.getSessionCreationPolicy()
得知它是用于加载Filter
- 通过
new AuthenticationConfigBuilder(element, forceAutoConfig, pc, httpBldr.getSessionCreationPolicy()
得知它是用于加载Filter
,其中的createFormLoginFilter
用于加载spring-Security.xml
配置的页面
- 通过
createFormLoginFilter
我们就可以加载用于加载登录页面
- 我们再通过
new AuthenticationConfigBuilder(element, forceAutoConfig, pc, httpBldr.getSessionCreationPolicy()
看到createUserDetailsServiceFactory()
用于实现数据库的认证操作,在我们自己的Service方法中应该扩展一个UserDetailsService
,UserDetailsService
中定义了一个方法用于完成认证,而createUserDetailsServiceFactory()
就是用于帮助UserDetailsService