Spring|Spring Security过滤器链体系的实例详解
以下摘自胖哥分享的 2022开工福利教程。
【Spring|Spring Security过滤器链体系的实例详解】在学习Spring Security的时候你有没有下面这两个疑问:
- Spring Security的登录是怎么配置的?
- Spring Security的访问控制是什么机制?
SpringBootWebSecurityConfiguration
中。你可以按照下面这个思维导图去理解这个自动配置:![Spring|Spring Security过滤器链体系的实例详解](https://img.it610.com/image/info11/9bbcb8d67c3446f3830100f386fe5445.jpg)
文章图片
SpringBootWebSecurityConfiguration
为Spring Boot应用提供了一套默认的Spring Security配置。@Bean @Order(SecurityProperties.BASIC_AUTH_ORDER) SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic(); return http.build(); }
这里的配置为:所有的请求都必须是认证用户发起的,同时开启表单登录功能以及Http Basic Authentication认证功能。 我们访问
/foo/bar
时需要登录认证并且能够进行表单登录就是这个配置起作用了。这个是我们日常开发需要自定义的,在HttpSecurity
相关的文章中胖哥也进行了讲解。这个SecurityFilterChain
到底是什么呢?SecurityFilterChain 从上面看得出
HttpSecurity
就是一个构建类,它的使命就是构建出一个SecurityFilterChain
:public interface SecurityFilterChain {//当前请求是否匹配 boolean matches(HttpServletRequest request); // 一揽子过滤器组成的有序过滤器链 ListgetFilters(); }
当一个请求
HttpServletRequest
进入SecurityFilterChain
时,会通过matches
方法来确定是否满足条件进入过滤器链。就好比你是VIP走的是VIP通道,享受的是VIP的一系列待遇;你是普通用户,就走普通用户的通道并享受普通用户的待遇。![Spring|Spring Security过滤器链体系的实例详解](https://img.it610.com/image/info11/dab3c8a15c984c6681cd524f472db68a.jpg)
文章图片
不管用户是哪种角色,都走的是一个过滤器链,一个应用中存在
1-n
个SecurityFilterChain
。那谁来管理多个SecurityFilterChain
呢?记住这个公式
HttpSecurity ->SecurityFilterChain
。FilterChainProxy
FilterChainProxy
是一个GenericFilterBean
(即使Servlet Filter又是Spring Bean),它管理了所有注入Spring IoC容器的SecurityFilterChain
。在我刚接触Spring Security的时候是这样配置FilterChainProxy
的:根据不同的请求路径匹配走不同的
SecurityFilterChain
。下面是示意图:![Spring|Spring Security过滤器链体系的实例详解](https://img.it610.com/image/info11/477ff66cced247f6ae95f820de4ef7b6.jpg)
文章图片
后面还会对接触这个类,现在你只需要明白上面这个图就行了。
请注意:在同一过滤器链中不建议有多个
FilterChainProxy
实例,而且不应将其作为单纯的过滤器使用,它只应该承担管理SecurityFilterChain
的功能。DelegatingFilterProxy Servlet 容器和Spring IoC容器之间的Filter生命周期并不匹配。为了让Spring IoC容器管理Filter的生命周期,
FilterChainProxy
便交由Spring Web下的DelegatingFilterProxy
来代理。而且FilterChainProxy
不会在添加到应用程序上下文的任何过滤器Bean上调用标准Servlet过滤器生命周期方法,FilterChainProxy
的生命周期方法会委托给DelegatingFilterProxy
来执行。而DelegatingFilterProxy
作为Spring IoC和Servlet的连接器存在。![Spring|Spring Security过滤器链体系的实例详解](https://img.it610.com/image/info11/0e4580aae9704decaf322455ec4ceb4a.jpg)
文章图片
简单总结 上面的三个概念非常重要,涉及到Spring Security的整个过滤器链体系。但是作为初学者来说,能看懂多少就看懂多少,不要纠结哪些没有理解,因为目前学习阶段的层次达不到是非常正常的。但是等你学完了Spring Security之后,这几个概念一定要搞明白。
到此这篇关于Spring Security过滤器链体系的文章就介绍到这了,更多相关Spring Security过滤器链体系内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 在SpringBoot中注入RedisTemplate实例异常的解决方案
- 使用Springboot注解形式进行模糊查询
- Spring|Spring Cloud Feign 使用对象参数的操作
- 优化spring|优化spring boot应用后6s内启动内存减半
- Spring|Spring MVC如何实现接口Controller定义控制器
- SpringBoot集成使用Redis及搭建过程
- SpringBoot整合RedisTemplate实现缓存信息监控的步骤
- SpringBoot实现redis缓存菜单列表
- java|springboot缓存+springboot整合redis缓存
- springboot|springboot配置redis缓存数据库查询