SpringSecurity6.X默认加载流程
2024-09-12 本文已影响0人
轻轻敲醒沉睡的心灵
我们先来了解一下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
这个类,在构造方法上打断点,调试查看:
过滤器