使用多个servlet时Spring security需要指明路由匹配策略问题

 更新时间:2024年08月14日 10:53:41   作者:mosplus  
这篇文章主要介绍了使用多个servlet时Spring security需要指明路由匹配策略问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

多个servlet时Spring security需要指明路由匹配策略

项目原本是 SpringBoot-3.1.3 + druid-1.2.21 ,并且 Druid 开启了可视化监控页 stat-view-servlet

将项目升级到 SpringBoot-3.1.4 后,启动项目时报错。

摘取部分内容:

Failed to instantiate [org.springframework.security.web.SecurityFilterChain]: Factory method ‘filterChain’ threw exception with message: This method cannot decide whether these patterns are Spring MVC patterns or not. If this endpoint is a Spring MVC endpoint, please use requestMatchers(MvcRequestMatcher); otherwise, please use requestMatchers(AntPathRequestMatcher).

This is because there is more than one mappable servlet in your servlet context: {org.springframework.web.servlet.DispatcherServlet=[/], com.alibaba.druid.support.jakarta.StatViewServlet=[/druid/*]}.

原因分析

错误信息可以看出来配置 Spring security 的放行策略时路由匹配的策略选择不当,

根据spring官方在关于 CVE-2023-34035 的安全报告中提到

Spring Security versions 5.8 prior to 5.8.5, 6.0 prior to 6.0.5 and 6.1 prior to 6.1.2 could be susceptible to authorization rule misconfiguration if the application uses or and multiple servlets, one of them being Spring MVC’s DispatcherServlet.

如果应用程序使用或和多个servlet(其中一个是Spring MVC的DispatcherServlet),则Spring Security 5.8.5之前的5.8版本、6.0.5之前的6.0版本和6.1.2之前的6.1版本可能容易受到授权规则错误配置的影响。

即除了 DispatcherServlet 以外,还存在其他 Servlet 时, Spring security 的路由匹配策略需要明确哪些路由模式是Spring MVC的。

修复问题

  • 例如旧版放行路径使用的是
http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/user/register").permitAll())
  • 改为
// MvcRequestMatcher策略
authorize.requestMatchers(new MvcRequestMatcher(new HandlerMappingIntrospector(), "/user/register")).permitAll()
                           
// AntPathRequestMatcher策略
authorize.requestMatchers(new AntPathRequestMatcher("/user/register")).permitAll()

其中 MvcRequestMatcherAntPathRequestMatcher 是两种不同的匹配规则。

具体概念不再赘述,核心点就是 MvcRequestMatcher 基于 DispatcherServlet 进行匹配。

路由策略区别

调整放行 Druid 的路径,使用 MvcRequestMatcher 策略匹配,正常启动。

但是访问网页的时候发现放行没生效,被 Spring security 拦截了,需要认证才能访问,调整为 AntPathRequestMatcher 则是正常放行。

因为 Druid 提供了自己的监控数据的 Servlet ,其是作为一个独立的 Servlet 映射到容器中,而并非通过 DispatcherServlet ,所以放行 Druid 就需要使用 AntPathRequestMatcher 方式。

authorize.requestMatchers(new AntPathRequestMatcher("/druid/**")).permitAll()

而对于 Swagger,通常它的页面和API文档都会被包括在 Spring MVC 的控制器里面,并且其URL路径会通过 @RequestMapping 注解映射,所以使用 MvcRequestMatcherAntPathRequestMatcher 都可以正确匹配到。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java的Semaphore信号量使用及原理解读

    Java的Semaphore信号量使用及原理解读

    这篇文章主要介绍了Java的Semaphore信号量使用及原理解读,Semaphore(信号量)是Java中一个并发控制工具,用于控制对共享资源的访问,它基于计数器的原理,可以限制同时访问某个资源的线程数量,需要的朋友可以参考下
    2023-12-12
  • Java数据结构之有向图的拓扑排序详解

    Java数据结构之有向图的拓扑排序详解

    这篇文章主要为大家详细介绍了Java数据结构中有向图的拓扑排序,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2022-11-11
  • RestTemplate设置超时时间及返回状态码非200处理

    RestTemplate设置超时时间及返回状态码非200处理

    这篇文章主要为大家介绍了RestTemplate设置超时时间及返回状态码非200处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Springboot中路径参数带 (%2F)的问题彻底解决方案

    Springboot中路径参数带 (%2F)的问题彻底解决方案

    这篇文章主要介绍了彻底解决Springboot中路径参数带(%2F)的问题,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Java锁竞争导致sql慢日志原因分析

    Java锁竞争导致sql慢日志原因分析

    这篇文章主要介绍了Java锁竞争导致sql慢的日志原因分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • java使用hadoop实现关联商品统计

    java使用hadoop实现关联商品统计

    本篇文章java使用hadoop实现关联商品统计,可以实现商品的关联统计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • Java中多个线程交替循环执行的实现

    Java中多个线程交替循环执行的实现

    有些时候面试官经常会问,两个线程怎么交替执行呀,本文就来详细的介绍一下Java中多个线程交替循环执行的实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • struts2与cookie 实现自动登录和验证码验证实现代码

    struts2与cookie 实现自动登录和验证码验证实现代码

    这篇文章主要介绍了struts2与cookie 实现自动登录和验证码验证实现代码的相关资料,需要的朋友可以参考下
    2016-10-10
  • java如何判断一个数是否是素数(质数)

    java如何判断一个数是否是素数(质数)

    这篇文章主要介绍了java如何判断一个数是否是素数(质数),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java使用servlet实现验证码

    java使用servlet实现验证码

    这篇文章主要介绍了java使用servlet实现验证码,简单实用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01

最新评论