【swagger】spring security中 swagger2,swagger3和knife4j集成的区别 真的弄懂了吗?

news2024/11/15 4:34:36

文章目录

  • 导包正确方式
  • swagger2在security中放行
  • swagger3在security中放行
    • knife4j放行失败原因分析:
    • swagger访问失败原因分析:

作为一个强迫症重度的程序猿 不想多导一个jar包

本文创作背景是鉴于网上大多数是旧版本swagger2的教程,且没有针对2和3区别描述,话不多说 直接步入正题。

导包正确方式

如果只需要knife4j文档 导这一个包就够了 这里以3.0+版本举例
(对springboot比较熟悉的同学应该清楚 starter目的就是将其它包并入一个包 旨在开箱即用 一个正确的stater 会把其它杂七杂八的包 都包含在里面)

		<!-- 如果只需要knife4j文档 导这一个包就够了 -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

如果还想同时使用swagger界面 那么需要额外一个包:

        <!--可选,引入后,原/swagger-ui.html提供的页面仍可正常使用-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>3.0.0</version>
        </dependency>

如果不想用knife4j 只想用swagger 不需要上面的包 那么只需要下面这个包:

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

本文是基于security环境 security的jar包


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

swagger2在security中放行

在swagger2中,根据大部分教程 我们的放行姿势 是经典的四件套:

/webjars/**
/swagger-resources/**
/v2/**
/swagger-ui/**

代码示例如下:

@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {

    /** WebSecurity 不走过滤链的放行  即不通过security 完全对外的/最大级别的放行 **/
    @Override
    public void configure(WebSecurity web) throws Exception {
          // test直接放行了  如果是login接口 必须通过HttpSecurity 走过滤链 因为登录涉及 SecurityContextHolder
        web.ignoring().antMatchers("/test/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 登录成功处理类
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");

        http.authorizeRequests()
                //静态文件允许访问
                .antMatchers("/assets/**").permitAll()
                .antMatchers("/webjars/**").permitAll()
                .antMatchers("/swagger-resources/**").permitAll()
                .antMatchers("/v2/**").permitAll()
                
                .antMatchers(  "/swagger-ui/**").permitAll()
                // 放行
                .antMatchers( "/login","css/**","/js/**","/image/*").permitAll()
                //其他所有请求需要登录, anyRequest 不能配置在 antMatchers 前面
                .anyRequest().authenticated()
                .and()
                //登录页面配置,用于替换security默认页面
//                .formLogin().loginPage(  "/login").successHandler(successHandler).and()
                //登出页面配置,用于替换security默认页面
//                .logout().logoutUrl( "/logout").and()
                .httpBasic();

    }
}

这段代码基本正确,但是有个隐患 : /v2/**
如果有同学遇到v2版本的开发, 且将接口以/v2开头 将造成严重后果
所以博主推荐 不要为了省事那么写 最好写全: /v2/api-docs


swagger3在security中放行

当某一天 我们版本迭代升级 更新到swagger3的时候,用上面配置 会发现swagger、knife都无法访问 这这这为什么呢?

下面提一下博主的分析思路:

knife4j放行失败原因分析:

其它配置未改变 只是starter版本升级 导致的放行失败 一般可以推测是两个原因:

  1. security 机制改变 正确放行姿势 不再是

             http.authorizeRequests()
             .antMatchers("/xxx/**").permitAll()
    

    但是我们应该明白 swagger只是一个额外的文档工具 它不应该去改变security的机制 所以这点我们可以排除

  2. 放行失败 说明url被拦截,url被拦截 那就意味着升级后 文档地址可能发生了改变

  3. 所以我们可以先将security的jar包先去除,观察knife4j文档页面:
    在这里插入图片描述

由此我们可知 需要新增一行放行代码:

      .antMatchers("/v3/api-docs").permitAll()

再将security包 重新加回项目中

swagger访问失败原因分析:

knife4j是因为url的变更 那swagger有没有也是这种可能呢?

我们之前(swagger2)的访问url是

localhost:8080/swagger-ui.html

这个地址是怎么来的呢?

在这里插入图片描述
html是在swagger-ui jar包中

那再看看swagger3中 它变成了什么:
在这里插入图片描述

没错 名字发生了改变,我们在swagger3中的正确访问url为:

localhost:8080/swagger-ui/index.html

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构初阶】第五篇——栈和队列

栈 栈的概念及结构 栈的实现 栈的初始化 销毁栈 入栈 出栈 获取栈顶元素 检测栈是否为空 获取栈中有效元素个数 队列 队列的概念和结构 队列的实现 队列的初始化 销毁队列 入队 出队 获取对头元素 获取队尾元素 判断队列是否为空 获取队列中元素个数 栈 栈…

13.包装类、正则表达式、Arrays类、常见算法、Lambda表达式

目录 一.包装类 1.1 什么是包装类 1.2 包装类的作用 1.3 自动装箱和自动拆箱 1.3.1 自动装箱 1.3.2 自动拆箱 1.4 包装类的特有功能 二.正则表达式 2.1 什么是正则表达式 2.2 正则表达式的规定字符 2.3 字符串对象匹配正则表达式的方法 2.4 正则表达式在字符串方法中…

21特征值和特征向量

特征值与特征向量初探 给定矩阵A&#xff0c;矩阵A乘以向量x&#xff0c;就像是使用矩阵A作用在向量x上&#xff0c;最后得到新的向量Ax。在这里&#xff0c;矩阵A就像是一个函数&#xff0c;接受一个向量x作为输入&#xff0c;给出向量Ax作为输出。 在这一过程中&#xff0c…

算法基础集训(第29天)------>DFS之排列数【DFS入门级算法,初学者必会】

一&#xff1a;概念定义该题对于排列数的定义是对给定的数字n&#xff0c;将从1~n的数字进行全排列并输出二&#xff1a;题目描述给定一个整数 n&#xff0c;将数字 1∼n 排成一排&#xff0c;将会有很多种排列方法。现在&#xff0c;请你按照字典序将所有的排列方法输出。输入…

Java——只出现一次的数字(2)

题目链接 leetcode在线oj题——只出现一次的数字(2) 题目描述 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且不使用额外空间来解…

Python对liunx中mysql数据库进行双表查询 10个案例带你了解

关于Python连接liunx中mysql数据库的方式在这一篇文章 这里写目录标题1.在Liunx服务器中的mysql新建一个表2.插入数据3.连接liunx中的mysql数据库1、查询1946班的成绩信息2&#xff0c;查询1944班&#xff0c;语文成绩大于60小于90的成绩信息3&#xff0c;查询学生表中1到6行的…

阿里国际站用户增长技术探索与实践

作者&#xff1a;阿里国际站用户增长团队 和众多传统行业一样&#xff0c;跨境贸易产业近年来也经历了数字化的转型创新&#xff0c;而首先参与进模式创新的地方主要集中于信息展示和业务撮合领域。本文将为大家分享阿里国际站在用户增长技术体系建设上的探索与实践。 一、跨境…

SpringBoot超大文件上传(总结)

SpringBoot超大文件上传&#xff0c;秒传&#xff01;分片上传!断电续传&#xff01;&#xff08;总结&#xff09;一. 秒传1、什么是秒传2、本文实现的秒传核心逻辑二. 分片上传1、什么是分片上传2、分片上传的场景三. 断点续传1、什么是断点续传2、应用场景3、实现断点续传的…

【ESP32 WiFi篇(六)】ESP32 WebSocket

文章目录1. WebSocket 概述2. WebSocket 的通信原理和机制3. WebSocket 与 HTTP 的关系3.1 相同点3.2 不同点3.3 关系4. WebSocket 技术出现之前&#xff0c;Web端实现即时通讯的方法有哪些&#xff1f;5. HTTP 存在的问题6. WebSocket 的特点7. WebSocket 数据帧格式1. WebSoc…

简单局域网网络故障排查和处置

简单局域网网络故障排查和处置一、了解基本网络构成1. IP传输通信图2.有线网络&#xff08;一&#xff09;物理层面&#xff08;1&#xff09;网线&#xff08;2&#xff09;网线的制作&#xff08;3&#xff09;网卡接口&#xff08;4&#xff09;光纤&#xff08;5&#xff0…

【图像配准】使用OpenCV进行多图配准拼接

本篇主要利用OpenCV自带的配准拼接函数Stitcher_create来实现多幅图像的配准拼接 代码参考自&#xff1a;https://github.com/samggggflynn/image-stitching-opencv 图像拼接创建步骤 通常来说&#xff0c;根据多个图像创建全景图的步骤为以下几步&#xff1a; 检测两张图像的…

【pytest】三、pytest之setup和teardown,及封装

一、引言&#xff1a; 1&#xff09;setup的作用&#xff1a;用来实现执行前的一些初始化操作(如&#xff1a;数据准备、连接设备、打开APP/浏览器、创建日志对象、创建数据库连接、创建接口的请求对象等操作)&#xff1b; 2&#xff09;teardown的作用&#xff1a;用来实现执…

C++学习/温习笔记:新型源码学编程(二)

写在前面 面向初学者撰写专栏&#xff0c;个人原创的学习C/C笔记&#xff08;干货&#xff09;编程练习所作源代码输出内容为中文&#xff0c;便于理解如有错误之处请各位读者指正请读者评论回复、参与投票&#xff0c;反馈给作者&#xff0c;我会获得持续更新笔记干货的动力。…

放弃内卷,创造新市场

在疫情&#xff0c;突然爆发的俄乌冲突&#xff0c;还有全球的物价上涨情况等社会问题逐渐变得尖锐的动荡中&#xff0c;让原本就不好的经济形势进入了寒冬期&#xff0c;各个行业也陆续进入了寒冬期&#xff0c;纷纷进入了内卷模式&#xff0c;尤其是对于跨境电商行业来说&…

linux 部署jmeter报错处理

一、linux 安装jdk Java Downloads | Oracle 二、 linux上传jmeter 2.1 上传jmeter jmeter 下载地址&#xff1a; Apache JMeter - Download Apache JMeter 注意&#xff1a; 我先在我本地调试脚本&#xff08;mac环境&#xff09;&#xff0c;调试完成后&#xff0c;再在…

java基于ssm的饰品商城的设计与实现

管理员&#xff1b;管理员使用本系统涉到的功能主要有个人中心、用户管理、商品分类管理、商品信息管理、活动商品管理、知识普及管理、饰品圈、系统管理、订单管理等功能。 用户进入前台可以查看首页、商品信息、活动商品、知识普及、饰品圈、公告信息、个人中心、后台管理、购…

全国产!全志A40i+Logos FPGA核心板(4核ARM Cortex-A7)硬件说明

硬件资源 SOM-TLA40iF核心板板载ARM、FPGA、ROM、RAM、晶振、电源、LED等硬件资源,并通过B2B连接方式引出IO。核心板所有器件(包括B2B连接器)均采用国产工业级方案,国产化率100%。 图 1 核心板硬件框图

哪有什么互联网寒冬?献给java程序员的面试全攻略,修炼内功,强大自己才是王道!

最近很多人在讨论&#xff0c;学Java还有前途吗&#xff1f;转行Java有希望吗?Java还值得学吗&#xff1f;诸如此类的问题太多了&#xff0c;见怪不怪&#xff0c;不用担心太多&#xff0c;我们来仔细分析一下为什么会出现这种情况。 首先&#xff0c;互联网行业近几年确实很…

scrapy构造并发送请求

scrapy数据建模与请求 学习目标&#xff1a; 应用 在scrapy项目中进行建模应用 构造Request对象&#xff0c;并发送请求应用 利用meta参数在不同的解析函数中传递数据 1. 数据建模 通常在做项目的过程中&#xff0c;在items.py中进行数据建模 1.1 为什么建模 定义item即提前…

【Linux】操作系统(Operator System)

目录 一、操作系统是什么 1、操作系统概念 2、操作系统的定位 3、设计OS的目的 4、操作系统的重要性 二、 理解操作系统 三、系统调用 系统调用和库函数的关系 一、操作系统是什么 1、操作系统概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统…