Spring Security过滤器链如何匹配到特定的请求

开发 架构
只有满足了SecurityFilterChain的match方法的请求才能被该SecurityFilterChain处理,那如何配置才能让一个SecurityFilterChain处理特定的路径呢?

过滤器通过上一篇文章知道SecurityFilterChain决定了哪些请求经过的过滤器链,那么SecurityFilterChain是如何匹配到特定请求的呢?今天胖哥就来带你揭开这个秘密,还希望各位同学能够点赞、再看、转发来一波。

如何拦截特定的请求

只有满足了SecurityFilterChain的match方法的请求才能被该SecurityFilterChain处理,那如何配置才能让一个SecurityFilterChain处理特定的路径呢?

RequestMatcher

HttpSecurity内置了RequestMatcher属性来处理路径匹配问题。RequestMatcher可总结为以下几大类:

使用Ant路径:

 httpSecurity.antMatcher("/foo/**");

如果你配置了全局的Servlet Path的话,例如/v1,配置ant路径的话就要/v1/foo/**,使用MVC风格可以保持一致:

 httpSecurity.mvcMatcher("/foo/**");

另外MVC风格可以自动匹配后缀,例如/foo/hello可以匹配/foo/hello.do、/foo/hello.action 等等。另外你也可以使用正则表达式来进行路径匹配:

 httpSecurity.regexMatcher("/foo/.+");

如果上面的都满足不了需要的话,你可以通过HttpSecurity.requestMatcher方法自定义匹配规则;如果你想匹配多个规则的话可以借助于HttpSecurity.requestMatchers方法来自由组合匹配规则,就像这样:

    httpSecurity.requestMatchers(requestMatchers ->
requestMatchers.mvcMatchers("/foo/**")
.antMatchers("/admin/*get"));

一旦你配置了路径匹配规则的话,你会发现默认的表单登录404了,因为默认是/login,你加了前缀后当然访问不到了。

使用场景

比如你后台管理系统和前端应用各自走不同的过滤器链,你可以根据访问路径来配置各自的过滤器链。例如:

    /**
* Admin 过滤器链.
*
* @param http the http
* @return the security filter chain
* @throws Exception the exception
*/
@Bean
SecurityFilterChain adminSecurityFilterChain(HttpSecurity http) throws Exception {
http.requestMatchers(requestMatchers -> requestMatchers.mvcMatchers("/admin/**"))
//todo 其它配置
return http.build();
}

/**
* App 过滤器链.
*
* @param http the http
* @return the security filter chain
* @throws Exception the exception
*/
@Bean
SecurityFilterChain appSecurityFilterChain(HttpSecurity http) throws Exception {
http.requestMatchers(requestMatchers -> requestMatchers.mvcMatchers("/app/**"));
//todo 其它配置
return http.build();
}

另外也可以使用该特性降低不同规则URI之间的耦合性。

思考一下HttpSecurity这个Spring Bean为什么能够重复使用。


责任编辑:武晓燕 来源: 码农小胖哥
相关推荐

2022-02-21 23:58:49

Spring过滤器顺序值

2022-02-10 14:54:31

Spring容器过滤器

2022-02-16 23:58:41

Spring过滤器验证码

2021-11-11 07:38:15

服务器过滤器框架

2024-01-05 09:04:35

隆过滤器数据结构哈希函数

2017-04-12 14:43:01

Spring ClouZuul过滤器

2023-01-26 01:41:27

核心全局过滤器

2021-07-05 15:22:03

Servlet过滤器客户端

2009-07-08 17:33:37

Servlet过滤器

2009-06-18 10:13:00

Hibernate过滤

2024-11-04 08:45:48

布隆过滤器元数据指纹值

2021-01-14 08:13:39

Spring Clou应用内置过滤器

2017-05-04 22:30:17

Zuul过滤器微服务

2009-07-08 15:30:56

Servlet过滤器

2009-09-29 13:55:23

Hibernate设置

2009-07-08 16:07:04

Servlet过滤器配

2009-07-14 09:09:08

Swing模型过滤器

2011-06-29 16:14:59

Qt 事件 过滤器

2016-12-07 09:56:13

JavaFilter过滤器

2017-07-18 14:10:31

大数据Apache Flum过滤器
点赞
收藏

51CTO技术栈公众号