我们先来了解一下SpringSecurity的架构工作流程。Springboot整合Security时,因为用的Tomcat,也就是Servlet容器。security那么多功能(账号密码验证、表单登陆、csrf、重定向等)都是通过一个个过滤器来实现的,按以前的写Filter逻辑,要写好多FilterRegistrationBean,然后在容器启动时都注册到servlet上去,显然这不方便管理,启用,禁用等。
- 其实,Spring有提供一个过滤器,管理这些注册的过滤器bean,就是
DelegatingFilterProxy。它是Servlet和Spring上下文之间的桥梁,Servlet通过DelegatingFilterProxy管理注册的过滤器bean。
一般模式
- 因为security是有很多过滤器的,所以
SpringSecurity又提供了一个自己的工具FilterChainProxy和SecurityFilterChain,将FilterChainProxy注册到Spring的DelegatingFilterProxy中,然后来管理SecurityFilterChain。 - 从
SecurityFilterChain的名字可以看出,它是一个过滤器链,可以包含多个过滤器。我们可以选择security中需要的功能加入到SecurityFilterChain中,也可以根据规则生成多个SecurityFilterChain,交给FilterChainProxy。这就给了我们更好的控制security中各个功能的方式。
所以整个流程是:security的功能Filter加入到SecurityFilterChain,然后SecurityFilterChain注册到FilterChainProxy,最后FilterChainProxy作为一个Filter注册到Spring的DelegatingFilterProxy上,最终到了servlet。
最终模式
1. 默认过滤器
当我们什么都不配置的时候,启动服务,SpringSecurity会加默认的过滤器,这些过滤器由DefaultSecurityFilterChain这个类管理的,我们将日志设置成DEBUG级别,启动时会打印默认使用的过滤器。
1.1 application.yml
添加日志级别
spring.application.name: security-test
spring.security.user.name: zs
spring.security.user.password: zs123
# 添加日志级别
logging.level.org.springframework.security: DEBUG
1.2 重新启动
重启,看控制台日志,后面记录了默认过滤器,有15个
image.png
DisableEncodeUrlFilter,
WebAsyncManagerIntegrationFilter,
SecurityContextHolderFilter,
HeaderWriterFilter,
CsrfFilter,
LogoutFilter,
UsernamePasswordAuthenticationFilter,
DefaultLoginPageGeneratingFilter,
DefaultLogoutPageGeneratingFilter,
BasicAuthenticationFilter,
RequestCacheAwareFilter,
SecurityContextHolderAwareRequestFilter,
AnonymousAuthenticationFilter,
ExceptionTranslationFilter,
AuthorizationFilter
1.3 断点查看方式
我们也可以找到DefaultSecurityFilterChain这个类,在构造方法上打断点,调试查看:
断点
过滤器








网友评论