knife4j生产环境资源屏蔽

这篇具有很好参考价值的文章主要介绍了knife4j生产环境资源屏蔽。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

knife4j是目前比较主流的自动API文档生成工具,在生产环境使用的过程中,我们一般会屏蔽或者去除Swagger的文档口径,防止接口信息泄露,保证系统安全。
但是最近在开发过程中使用knife4j-spring-boot-starter 3.0.2过程中,发现根据官网说明配置后,还是有部分Swagger的文档口径无法完全屏蔽。

项目背景spring-boot-starter-parent 2.2.6.RELEASE + knife4j-spring-boot-starter 3.0.2

<dependency>
     <groupId>com.github.xiaoymin</groupId>
     <artifactId>knife4j-spring-boot-starter</artifactId>
     <version>3.0.2</version>
 </dependency>

属性配置

# knife4j的增强配置
knife4j.enable=true
# 开启生产环境屏蔽,一定要先开启knife4j增强才会生效
knife4j.production=true

访问http://localhost:8080/doc.html,资源已被屏蔽:
knife4j 生产环境,spring boot实战,java,knife4,资源屏蔽,3.0.2,production
访问/v2/api-docs地址,资源已经被屏蔽:
knife4j 生产环境,spring boot实战,java,knife4,资源屏蔽,3.0.2,production

访问/v3/api-docs地址,资源未屏蔽:
knife4j 生产环境,spring boot实战,java,knife4,资源屏蔽,3.0.2,production

问题小结:
在使用knife4j-spring-boot-starter 3.0.2 + openApi3.0时,通过配置knife4j.enable=true和knife4j.production=true属性,虽然屏蔽了部分Swagger的文档口径,但/v3/api-docs口径并没有被屏蔽,还是有接口信息泄露的风险。


原因分析:

官方文档:knife4j访问权限控制-生产环境屏蔽资源

首先通过查看官方文档,我们发现在需要屏蔽的资源中确实没有包含/v3/api-docs口径。
knife4j 生产环境,spring boot实战,java,knife4,资源屏蔽,3.0.2,production

继续通过源码分析,在Knife4jAutoConfiguration类中,knife4j.production=true控制是否实例化ProductionSecurityFilter对象:

@Bean
    @ConditionalOnMissingBean({ProductionSecurityFilter.class})
    @ConditionalOnProperty(
        name = {"knife4j.production"},
        havingValue = "true"
    )
    public ProductionSecurityFilter productionSecurityFilter(Knife4jProperties knife4jProperties) {
        boolean prod = false;
        ProductionSecurityFilter p = null;
        if (knife4jProperties == null) {
            if (this.environment != null) {
                String prodStr = this.environment.getProperty("knife4j.production");
                if (this.logger.isDebugEnabled()) {
                    this.logger.debug("swagger.production:{}", prodStr);
                }

                prod = Boolean.valueOf(prodStr);
            }

            p = new ProductionSecurityFilter(prod);
        } else {
            p = new ProductionSecurityFilter(knife4jProperties.isProduction());
        }

        return p;
    }

而ProductionSecurityFilter继承自BasicFilter:

public class BasicFilter {
    private Logger logger = LoggerFactory.getLogger(BasicFilter.class);
    protected List<Pattern> urlFilters = null;

     //需要屏蔽的资源
    public BasicFilter() {
        this.urlFilters = new ArrayList();
        this.urlFilters.add(Pattern.compile(".*?/doc\\.html.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/v2/api-docs.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/v2/api-docs-ext.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/swagger-resources.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/swagger-ui\\.html.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/swagger-resources/configuration/ui.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/swagger-resources/configuration/security.*", 2));
    }

    //路径匹配
    protected boolean match(String uri) {
        boolean match = false;
        if (uri != null) {
            Iterator var3 = this.getUrlFilters().iterator();

            while(var3.hasNext()) {
                Pattern pattern = (Pattern)var3.next();
                if (pattern.matcher(uri).matches()) {
                    match = true;
                    break;
                }
            }
        }
        return match;
    }

可以发现在knife4j-spring-boot-starter 3.0.2 版本中,BasicFilter屏蔽的资源中并不包括/v3/api-docs资源口径,这也就导致knife4j.production=true属性不能屏蔽/v3/api-docs资源口径。


解决方案:

方式一:自定义ProductionSecurityFilter

上文我们已经分析出没有屏蔽/v3/api-docs资源口径的原因是ProductionSecurityFilter对象的父类BasicFilter屏蔽的资源列表中缺少/v3/api-docs资源口径,首先想到的是是否能通过自定义ProductionSecurityFilter对象来手动添加/v3/api-docs资源口径,实现资源屏蔽。

在项目的Knife4j的配置类Knife4jConfig中添加如下代码:

     @Bean
    @ConditionalOnProperty(
            name = {"knife4j.production"},
            havingValue = "true"
    )
    public ProductionSecurityFilter productionSecurityFilter(Knife4jProperties knife4jProperties) {
        boolean prod = false;
        ProductionSecurityFilter p = null;
        if (knife4jProperties == null) {
            if (this.environment != null) {
                String prodStr = this.environment.getProperty("knife4j.production");
                log.debug("swagger.production:{}", prodStr);
                prod = Boolean.valueOf(prodStr);
            }
            p = new MyProductionSecurityFilter(prod);
        } else {
            p = new MyProductionSecurityFilter(knife4jProperties.isProduction());
        }

        return p;
    }

    //自定义ProductionSecurityFilter,添加`/v3/api-docs`资源口径
    public static class MyProductionSecurityFilter extends ProductionSecurityFilter{
        public MyProductionSecurityFilter(boolean production) {
            super(production);
            super.urlFilters.add(Pattern.compile(".*?/v3/api-docs.*", 2));
        }
    }

方式二:升级knife4j版本到3.0.3

将knife4j-spring-boot-starter升级到最新的版本3.0.3

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

该版本中BasicFilter屏蔽资源列表中已经包含/v3/api-docs资源口径:
knife4j 生产环境,spring boot实战,java,knife4,资源屏蔽,3.0.2,production

方式三:禁用springfox自动配置

因为knife4j底层是依赖的springfox,也可以通过禁用springfox来屏蔽资源。
knife4j 生产环境,spring boot实战,java,knife4,资源屏蔽,3.0.2,production
属性配置:

#禁用springfox
springfox.documentation.enabled=false
# 如果禁用springfox,则不能开启knife4j增强,否则项目启动会报错
knife4j.enable=false

knife4j 生产环境,spring boot实战,java,knife4,资源屏蔽,3.0.2,production
knife4j 生产环境,spring boot实战,java,knife4,资源屏蔽,3.0.2,production文章来源地址https://www.toymoban.com/news/detail-732209.html

到了这里,关于knife4j生产环境资源屏蔽的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java - 框架 - Knife4j】随笔

    项目文件; 【1】 【2】 【3】

    2024年01月21日
    浏览(29)
  • Knife4j文档请求异常(更新)

    在SpringBoot项目中,如果是分不同的模块开发。 注解配置 @EnableSwagger2WebMvc 不在启动类上,而是加到了其他模块的注解中,可能会导致这种情况发生。 我的是common一个单独的模块,在common模块中配置了WebMvcConfig。 然后在WebMvcConfig类上面加了注解 @EnableSwagger2WebMvc . 那么,解决方

    2024年01月18日
    浏览(31)
  • springboot集成knife4j详细教程

    使用原生的swagger作为接口文档,功能不够强大,并且默认的ui比较简陋,不符合大众审美。所以实际开发中推荐使用knife4j对swagger进行增强。knife4j的地址:https://gitee.com/xiaoym/knife4j 想要使用knife4j非常简单,只要在Springboot项目中引入knife4j的依赖即可 注意:引入knife4j后会自动

    2024年02月20日
    浏览(28)
  • knife4j依赖报错-----------解决方法

    1.可以尝试clean 再刷新maven 2.从中央仓库中重新加载 快捷键:Ctrl+Alt+Shift+S 或者file下打开Project Structure... 选择上面的+号,.m2文件夹下,如果有下载好的 knife4j 文件可以全部删除或者移动到别的位置,再继续添加,也可以选择Jar 找到knife4j文件指定其中一个文件,把上图中报错

    2024年02月12日
    浏览(22)
  • 第十三章 SpringBoot整合knife4j

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 [Java项目实战] 介绍Java组件安装、使用;手写框架等 [Aws服务器实战] Aws Linux服务器上操作nginx、git、JDK、Vue等 [Java微服务

    2024年02月03日
    浏览(33)
  • Swagger + Knife4j 接口文档的整合

    Swagger 接口文档的整合: 引入依赖(Swagger 或 Knife4j)。 自定义 Swagger 配置类。 定义需要生成接口文档的代码位置(Controller)。 注意:线上环境不要把接口暴露出去!!!可以通过在 SwaggerConfig 配置文件开头加上 @Profile({“dev”, “test”}) 限定配置仅在部分环境开启。 启动

    2024年01月20日
    浏览(41)
  • springboot整合Knife4j--token头验证

    Knife4j其实就是增强版本的swagger,过多的介绍我就不说了,一搜一大把,直接开始吧哈哈 1.引入pom依赖 需要其他版本的可以去https://mvnrepository.com/  自己选择。 2.配置类 链式调用时api指定需要扫描的包,如果在配置加入@ConditionalOnProperty注解可以在yml文件配置用户名密码等等,

    2023年04月08日
    浏览(26)
  • 全网多种方式解决Knife4j文档请求异常

    今天在本地启动项目后,刷新 Knife4j 接口文档,却报出如下错误: 即 Knife4j文档请求异常 。 报出 Knife4j文档请求异常 错误时,赶紧打开控制台,如下图所示: 控制台提示为 Unchecked runtime.lastError: The message port closed before a response was received. 简单理解就是 端口号关闭 了,于是查

    2023年04月08日
    浏览(62)
  • springcloud-gateway集成knife4j

    springcloud-gateway集成knife4j(swagger2) 环境信息 准备工作 微服务集成knife4j 第一步:编写Knife4jApiInfoProperties 第二步:编写配置类Knife4jConfig 第三步:放行相关资源 保证启动了knife4j 网关集成knife4j 编写配置类Knife4jGatewayConfig 测试验证 相关资料 spring-boot:2.6.3 spring-cloud-alibaba:2

    2023年04月09日
    浏览(27)
  • Knife4j系列--使用-教程-实例-配置 详细讲解

    Knife4j是基于springboot构建的一个文档生成工具,它可以让开发者为我们的应用生成API文档,目的是可以更加方便的基于API文档进行测试,生成的文档还可以导出,然后给到前端开发团队,前端开发团队可以基于API接口写具体的调用。 Knife4j 功能强大,易于操作。 Knife4j 的UI界面

    2024年02月10日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包