SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配
作者:mmseoamin日期:2024-04-29

概述

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第1张

如官方流程图所示,FiltrerCahinProxy会代理多个SecurityFilterChain,而FiltrerCahinProxy会根据request的路径和SecurityFilterChain规定的拦截路径进行匹配;在SpringSecurity中一个SecurityFilterChain的实现就是一个继承了WebSecurityConfigurerAdapter的配置类;

要在SecurityFilterChain中添加Filter只需要在对应的配置类的configure(HttpSecurity)方法中调用addFilterXX方法将继承自OncePerRequestFilter对象进行添加即可。

一、自定义Filter

1、新建一个MyFilter类;继承自OncePerRequestFilter;

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第2张

2、在配置类中添加此Filter,我将其添加在LogoutFilter之前

先看添加之前有15个Filter

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第3张

在configure(HttpSecurity http)方法中将MyFilterTest添加到LogoutFilter之前

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第4张

再看发现变成了16个filter;多了一个MyFilterTest,他确实是在LogoutFilter前面的

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第5张

二、自定义FilterChain

1、新建配置FilterChainTestConfig继承自WebSecurityConfigurerAdapter;实现其三个configure方法;

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第6张

2、使用注解@Order(200)标注其位置为默认的之前,值越大越靠后,默认100

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第7张

3、观察FilterChain的个数

可以看到添加之前有5个FilterChain

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第8张

我们的配置添加之后变成了6个;可以看到多了一个FilterChain;并且给我们添加了默认的filter

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第9张

如果我们要在这个自定义的FilterChain中添加新的Filter,只需要跟前面步骤一样,写一个继承自OncePerRequestFilter的Filter;然后FilterChainTestConfig的configure(HttpSecurity http)方法中的addFilterXXX方法添加即可。

三、设置FilterChain的匹配路径

1、给自定义的FilterChain设置匹配路径:“/test/matcherTest”

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第10张

2、查看FilterChain匹配路径的变化;

添加前

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第11张

添加后可以看到有了匹配路径

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第12张

四、跟踪FilerChain的匹配过程

1、发送一个人任意请求;观察FilterChainProxy的doFilterInternal方法;跟进getFilters操作

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第13张

可以看到FilterChacins中有6个,其中就有咋们自定义的;然后可以看到源代码中他会对filterChains进行遍历,跳出循环的条件是匹配到此请求对应的FilteChain;

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第14张

可以看到通过/**的匹配拿到了Filters;

2、发送一个"/test/matcherTest"的请求,观察FilterChainProxy的doFilterInternal方法;跟进getFilters操作

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第15张

可以看到FilterChains中还是有6个,然后获取到的Filters还是16个,只是因为我们自定义的FilterChains是在匹配any request的FilterChains的后面,当匹配到any request的时候就已经返回了,不会再向后匹配。

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第16张

然后我们修改我们自定义的配置类FilterChainTestConfig的order为99(小于默认的100即可);将其放在any request的匹配之前;

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第17张

重新发送"/test/matcherTest"请求,可以看到FilterChains中我们自定义的FilterChain已经再any request的之前了;

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第18张

然后再观察获取到的filters已经是10个,也就是咋们自定义的FilterChains中默认添加的了

SpringSecurity自定义Filter、自定义FilterChain以及FilterChain的匹配,在这里插入图片描述,第19张