SpringSecurity6.X默认加载流程

我们先来了解一下SpringSecurity的架构工作流程。Springboot整合Security时,因为用的Tomcat,也就是Servlet容器。security那么多功能(账号密码验证、表单登陆、csrf、重定向等)都是通过一个个过滤器来实现的,按以前的写Filter逻辑,要写好多FilterRegistrationBean,然后在容器启动时都注册到servlet上去,显然这不方便管理,启用,禁用等。

  • 其实,Spring有提供一个过滤器,管理这些注册的过滤器bean,就是 DelegatingFilterProxy。它是Servlet和Spring上下文之间的桥梁,Servlet通过DelegatingFilterProxy管理注册的过滤器bean。
    一般模式
  • 因为security是有很多过滤器的,所以SpringSecurity又提供了一个自己的工具FilterChainProxySecurityFilterChain,将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这个类,在构造方法上打断点,调试查看:

断点

过滤器

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容