使用多个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 都可以正确匹配到。

总结

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

相关文章

  • 20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Java操作Word文档的全面指南

    Java操作Word文档的全面指南

    在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文档的主流方案,需要的朋友可以参考下
    2025-11-11
  • java字节流知识点总结

    java字节流知识点总结

    在本篇文章里小编给大家分享的是关于java字节流的相关知识点内容,有兴趣的朋友们跟着学习参考下。
    2019-07-07
  • java复制文件的4种方式及拷贝文件到另一个目录下的实例代码

    java复制文件的4种方式及拷贝文件到另一个目录下的实例代码

    这篇文章主要介绍了java复制文件的4种方式,通过实例带给大家介绍了java 拷贝文件到另一个目录下的方法,需要的朋友可以参考下
    2018-06-06
  • Java中String类使用方法总结

    Java中String类使用方法总结

    这篇文章主要介绍了Java中String类的使用方法,文章简单易懂,结尾有实例代码帮助大家理解学习,感兴趣的朋友可以了解下
    2020-06-06
  • 详解基于java的Socket聊天程序——初始设计(附demo)

    详解基于java的Socket聊天程序——初始设计(附demo)

    本篇文章主要介绍了Socket聊天程序——初始设计(附demo),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • MyBatis源码浅析(一)开篇

    MyBatis源码浅析(一)开篇

    源码的学习好处多多,Mybatis源码量少、逻辑简单。下面将通过本文给大家详解,低mybatis源码浅析感兴趣的朋友一起看看吧
    2016-11-11
  • idea聚合工程搭建过程详解

    idea聚合工程搭建过程详解

    本章主要以order订单服务来远程调用payment支付服务为例,当然这里只是简单的一个远程调用,没有太复杂的逻辑,重点是要掌握的是maven的聚合工程搭建,微服务分模块的思想,每一个步骤我都会详细记录,并且文章下方还提供了git源码地址
    2022-06-06
  • 详解SpringBoot容器的生命周期

    详解SpringBoot容器的生命周期

    在使用SpringBoot进行开发时,我们经常需要对Spring容器的生命周期进行了解和掌握,本文将介绍SpringBoot容器的生命周期,包括容器的创建、初始化、销毁等过程,并提供相应的代码示例
    2023-06-06
  • Spring整合JUnit详解

    Spring整合JUnit详解

    Spring 是目前主流的 Java Web 开发框架,是 Java 世界最为成功的框架。该框架是一个轻量级的开源框架,这篇文章主要介绍如何配置数据源、注解开发以及整合Junit,感兴趣的同学可以参考一下
    2023-04-04

最新评论