SpringSecurity架构设计
官方文档:Spring Security的底层原理, 下文将由浅入深介绍Spring Security的架构。
1. 整体架构
Spring Security基于SpringMVC框架(Spring MVC底层就是通过DispatcherServlet来处理用户请求的),使用Servlet过滤器链机制来身份认证、授权和安全防范特性的:
1.1 DelegatingFilterProxy
复杂的业务中不可能只有一个过滤器, 在SpringBoot中需要方便的管理这些Filter,也就是放到Spring容器(为了区分称为Bean Filter)而不是Servlet容器中,Spring Security设计并提供的一个具体的Filter实现:DelegatingFilterProxy,DelegatingFilterProxy过滤器会负责从ApplicationContext中查找FilterChainProxy。然后将所有工作委托给FilterChainProxy。DelegatingFilterProxy是真正注册到Servlet容器当中的。
1.2 FilterChainProxy
FilterChainProxy是Spring Security提供的一个特殊的Filter,它允许通过SecurityFilterChain顺序规则将过滤器的工作委托给多个具体的Bean Filter实例。它支持多个SecurityFilterChain之间的调用。由于存在多个SecurityFilterChain,这也就是没有让DelegatingFilterProxy直接管理SecurityFilterChain的原因,避免DelegatingFilterProxy的复杂性。
1.3 SecurityFilterChain
SecurityFilterChain被FilterChainProxy使用,负责查找和维护当前的请求需要执行的Bean Filter列表。而这些Bean Filter列表是只注册到Spring容器中的。
1.4 Multiple SecurityFilterChain
可以有多个SecurityFilterChain的配置,FilterChainProxy会决定使用哪个SecurityFilterChain。这样设计使得某些的url可以支持仅被部分Bean Filter处理而不是所有的Bean Filter,比如请求的URL是/api/**,它首先匹配SecurityFilterChain0的模式,因此只调用SecurityFilterChain 0。
2. 程序的启动和运行
2.1 DefaultSecurityFilterChain
Spring Security启动后,默认提供了一个SecurityFilterChain,它就是DefaultSecurityFilterChain实例对象,它是SecurityFilterChain接口的唯一实现,里面包含了15个Filter: 其中UsernamePasswordAuthenticationFilter用来校验用户名和密码的。
2.2 SecurityProperties
默认情况下Spring Security将初始的用户名和密码存在了SecurityProperties类中。这个类中有一个静态内部类User,配置了默认的用户名(name = "user")和密码(password = uuid) 我们也可以将用户名、密码配置在SpringBoot的配置文件中:在application.properties中配置自定义用户名和密码:
spring.security.user.name=user
spring.security.user.password=123