首页 > 其他分享 >Spring Boot环境下自定义shiro过滤器会过滤所有的url的问题

Spring Boot环境下自定义shiro过滤器会过滤所有的url的问题

时间:2023-10-29 17:00:12浏览次数:41  
标签:自定义 url Spring put order 过滤器 urls shiroAuthFilter filterMap

问题起因:

在Shiro配置类中定义如下:

@Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(ShiroAuthFilter shiroAuthFilter, SecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        Map<String, Filter> filters = new HashMap<>(1);
        filters.put("shiroAuthFilter", shiroAuthFilter);
        factoryBean.setFilters(filters);
        factoryBean.setSecurityManager(securityManager);

        // 必须使用LinkedHashMap来保持有序性
        Map<String, String> filterMap = new LinkedHashMap<>();
        // anon: Filter that allows access to a path immeidately without performing security checks of any kind.
        filterMap.put("/swagger*/**", "anon");
        filterMap.put("/v2/api-docs", "anon");
        filterMap.put("/test/**", "anon");
        filterMap.put("/**", "shiroAuthFilter");
        System.out.println(filterMap.keySet());
        factoryBean.setFilterChainDefinitionMap(filterMap);

        return factoryBean;
    }

可以发现,我正确地使用了LinkedHashMap作为存储集合并把filterMap.put("/**", "shiroAuthFilter");放在了最后,按道理是最后一个过滤的,但结果是访问如/test/2/swagger/123这样的路径也会被自定义的shiroAuthFilter过滤器拦截

在网上搜索大量资料后发现SpringBoot会自动注册shiroAuthFilter为全局过滤器,即使只使用了@Component注解。

顺序如下:

2023-10-29 16:29:18.810 DEBUG 24532 --- [  restartedMain] o.s.b.w.s.ServletContextInitializerBeans : 
Mapping filters: 
filterRegistrationBean urls=[/*] order=2147483647, 
com.timqiu.ocos.filter.XssFilter urls=[/*] order=2147483647, 
characterEncodingFilter urls=[/*] order=-2147483648, 
formContentFilter urls=[/*] order=-9900, 
requestContextFilter urls=[/*] order=-105, 
shiroAuthFilter urls=[/*] order=2147483647,
shiroFilterFactoryBean urls=[/*] order=2147483647

顺便说下如何开启这个日志:

logging:
  level:
    web: debug

可以看到,shiroAuthFiltershiroFilterFactoryBean之前,匹配路径为/*,并且优先级还和shiroFilterFactoryBean一样!!!!

也就是说,不管请求怎么走,都会先经过shiroAuthFilter过滤器而不会走shiroFilterFactoryBean过滤器!!!

那怎么解决呢?当然是禁用掉该过滤器的自动注册功能!!

在SpringBoot官方文档中就说的很清楚如何禁用过滤器的自动注册功能:

Disable Registration of a Servlet or Filter

As described earlier, any Servlet or Filter beans are registered with the servlet container automatically. To disable registration of a particular Filter or Servlet bean, create a registration bean for it and mark it as disabled, as shown in the following example:

@Configuration(proxyBeanMethods = false)
public class MyFilterConfiguration {

    @Bean
    public FilterRegistrationBean<MyFilter> registration(MyFilter filter) {
        FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(filter);
        registration.setEnabled(false);
        return registration;
    }

}

链接如下:Spring Boot Reference Documentation

禁用之后,再次查看日志,发现没有shiroAuthFilter这一项了,正常访问没有被过滤的网址,问题解决。

标签:自定义,url,Spring,put,order,过滤器,urls,shiroAuthFilter,filterMap
From: https://www.cnblogs.com/timqiu/p/17796048.html

相关文章

  • 【Shell】环境变量 自定义变量 特殊变量
    Shell变量:环境变量目标1、理解什么是系统环境变量?2、掌握常用的系统环境变量都有哪些?Shell变量的介绍变量用于存储管理临时的数据,这些数据都是在运行内存中的.变量类型系统环境变量自定义变量特殊符号变量系统环境变量介绍是系统提供的共享变量.是linux系统加载Shell的配置文件中......
  • Spring Bean 名称暗藏玄机,这样取名就不会被代理
    一些使用小细节就是在不断的源码探索中逐步发现的,今天就来和小伙伴们聊一下通过beanName的设置,可以让一个bean拒绝被代理!1.代码实践假设我有如下一个切面:@Aspect@EnableAspectJAutoProxy@ComponentpublicclassLogAspect{@Pointcut("execution(*org.javaboy.demo.s......
  • 收藏从未停止,练习从未开始——MYSQL游标存储过程IDEA快捷键配置SpringBoot入门到入土G
    “收藏从未停止,练习从未开始”,或许有那么一些好题好方法,在被你选中收藏后却遗忘在收藏夹里积起了灰?今天请务必打开你沉甸甸的收藏重新回顾,分享一下那些曾让你拍案叫绝的好东西吧!本人详解:(提醒:随笔)本人详解作者:王文峰,参加过2020年度博客之星,《Java王大师王天师》作者采购供应链共享......
  • 【SpringBoot】Docker部署
    docker部署是主流的部署方式,极大的方便了开发部署环境,保持了环境的统一,也是实现自动化部署的前提。1项目的目录结构package:点击打包,生成xxx-SNAPSHOT.jartarget目录:打包生成目录,生成的jar存放位置Dockerfile:跟项目根目录同级2创建Dockerfile#Docker镜像构......
  • springboot+vue2+element学生信息管理系统
    效果:  .vue<template><div><el-containerstyle="height:700px;border:1pxsolid#eee"><el-headerstyle="font-size:40px;background-color:rgb(238,241,246)">学生管理</el-header&......
  • springboot 断点上传、续传、秒传实现
    前言springboot断点上传、续传、秒传实现。保存方式提供本地上传(单机)和minio上传(可集群)本文主要是后端实现方案,数据库持久化采用jpa一、实现思路前端生成文件md5,根据md5检查文件块上传进度或秒传需要上传分片的文件上传分片文件分片合并后上传服务器二、数据库表对象说明:Abs......
  • Spring为什么建议构造器注入?看看和你所理解的一样吗?
    Spring框架鼓励使用构造器注入的主要原因是出于设计原则和最佳实践的考虑,这有助于提高代码的可维护性、可测试性和整体质量。以下是详细说明为什么Spring建议构造器注入以及相关实例代码:1.易于测试构造器注入使得对类的单元测试变得更加容易。通过将依赖项作为构造函数的参数传递,......
  • SpringBoot使用Redis分布式缓存
    Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基......
  • springboot项目实现断点续传功能
    这篇文章主要介绍了springboot项目实现断点续传,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 java代码packagecom.ruoyi.web.upload.controller;importcom.ruoyi.web.upload.dto.FileChunkDTO;importcom.ruoyi.......
  • coredns自定义域名设置
    #增加自定义域名www.abc.com,对应的IP是1.2.3.4。kubectleditconfigmapcoredns-nkube-systemfallthrough表示在hosts找不到解析的域名时,传递给CoreDNS的下一个插件,避免集群内部域名解析失败。重建corednspod,刷新corednsConfigMap配置。参考资料https://www.cnblogs.c......