oauth2和knife4j结合

news2025/6/19 14:59:08

1.先说knife4j是个什么东西

他是swagger的升级版,在有swagger的调试功能以及接口描述的基础上,让人看着更加一目了然。

这次可能说的比较浅,主要是说怎么使用以及简单配置,还有我自己踩过的坑,因为这个东西我也第一次用。

截个图看看效果

有文档,有调试,可以代替postman了

2. 如何与oauth2权限校验结合

这是重点,我踩了半天坑呢

使用方式有两种,一个是在knife4j通过接口,灵活获取。另一种是通过别的地方获取到token,粘贴到knife4j中。

不管那种方式,token都是作用到全局的

当点击按钮Authorize授权后,如果授权成功,接下来点击其余的接口进行调试时,在请求头会存在参数 Authorization ,如何在未授权之前打开了接口,则需要在授权后关闭该接口的Tab,然后重新打开  

2.1通过别的地方获取到token,粘贴到knife4j中。

 2.1.1 代码实现

package config;

import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.OAuthBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

import java.util.ArrayList;
import java.util.List;

/**
 * Kni4j配置类
 *
 * @author haoxr
 * @date 2021-02-25 15:36
 */
@Configuration
@EnableSwagger2WebMvc
@Import(BeanValidatorPluginsConfiguration.class)
@Slf4j
public class SwaggerConfiguration {

    //这个是说swagger功能开启还是关闭,一般来讲生产环境关闭,其他环境开启
    @Value("${swagger.enable}")
    private boolean swaggerEnable;

    @Bean
    public Docket restApi() {
        //schemas
        SecurityContext securityContext = new SecurityContext(Lists.newArrayList(defaultAuth()), PathSelectors.ant("/**"));
        //securityContext
        List<SecurityContext> securityContexts = Lists.newArrayList(securityContext);
        return new Docket(DocumentationType.SWAGGER_2)
                .enable(swaggerEnable)
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))//所有带@Api注解的类都能扫描到
                .paths(PathSelectors.any())
                .build()
                .securityContexts(securityContexts)
                .securitySchemes(securitySchemes())
                .apiInfo(apiInfo());
    }

    /**
     * 安全模式,这里指定token通过Authorization头请求头传递
     */
    private List<SecurityScheme> securitySchemes() {
        // 设置请求头信息
        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
        //请求头里边有Authorization
        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
        return apiKeyList;
    }

    /**
     * 默认的安全上引用
     */
    private List<SecurityReference> defaultAuth() {
        //Authorization作用于全局所有接口
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("系统管理")
                .description("<div style='font-size:14px;color:red;'>测试</div>")
                .termsOfServiceUrl("https://www.youlai.tech")
                .contact(new Contact("测试", "https://gitee.com/youlaiorg", "youlaitech@163.com"))
                .license("Apache-2.0")
                .licenseUrl("https://www.apache.org/licenses/LICENSE-2.0")
                .version("1.0.0")
                .build();
    }

}

2.2在knife4j通过接口,灵活获取

这个官方文档写了四种方式 我用的是第四种 3.19.4 密码模式(password)

3.19 OAuth2 - Knife4j 中文文档 v4.0 - 开发文档 - 文江博客

2.2.1代码实现

package config;

import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.OAuthBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

import java.util.ArrayList;
import java.util.List;

/**
 * Kni4j配置类
 */
@Configuration
@EnableSwagger2WebMvc
@Import(BeanValidatorPluginsConfiguration.class)
@Slf4j
public class SwaggerConfiguration {

    //这个就是展示在页面上的url,权限验证所需的url
    @Value("${knife4j.password_token_url}")
    private String passwordTokenUrl;

    @Value("${swagger.enable}")
    private boolean swaggerEnable;

    @Bean
    public Docket restApi() {
        //schema
        List<GrantType> grantTypes = new ArrayList<>();
        //密码模式
        ResourceOwnerPasswordCredentialsGrant resourceOwnerPasswordCredentialsGrant = new ResourceOwnerPasswordCredentialsGrant(passwordTokenUrl);
        grantTypes.add(resourceOwnerPasswordCredentialsGrant);
        OAuth oAuth = new OAuthBuilder().name("oauth2")
                .grantTypes(grantTypes).build();
        //context
        //scope方位
        List<AuthorizationScope> scopes = new ArrayList<>();
        scopes.add(new AuthorizationScope("read", "read  resources"));
        scopes.add(new AuthorizationScope("write", "write resources"));
        scopes.add(new AuthorizationScope("reads", "read all resources"));
        scopes.add(new AuthorizationScope("writes", "write all resources"));

        SecurityReference securityReference = new SecurityReference("oauth2", scopes.toArray(new AuthorizationScope[]{}));
        SecurityContext securityContext = new SecurityContext(Lists.newArrayList(securityReference), PathSelectors.ant("/**"));
        //schemas
        List<SecurityScheme> securitySchemes = Lists.newArrayList(oAuth);
        //securityContext
        List<SecurityContext> securityContexts = Lists.newArrayList(securityContext);
        return new Docket(DocumentationType.SWAGGER_2)
                .enable(swaggerEnable)
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                .paths(PathSelectors.any())
                .build()
                .securityContexts(securityContexts)
                .securitySchemes(securitySchemes)
                .apiInfo(apiInfo());
    }
    
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("系统管理")
                .description("<div style='font-size:14px;color:red;'>测试</div>")
                .termsOfServiceUrl("https://www.youlai.tech")
                .contact(new Contact("测试", "https://gitee.com/youlaiorg", "youlaitech@163.com"))
                .license("Apache-2.0")
                .licenseUrl("https://www.apache.org/licenses/LICENSE-2.0")
                .version("1.0.0")
                .build();
    }

}

只能用token接口:这里要注意,如果你用的oauth2,那你就别想着自己加接口了,反正我研究半天,只能用oauth2自带的token接口。不然权限校验那里 principal会为空

而且他对返回的报文结构是有要求的,我们系统之前统一返回的是data包起来的json串,然后我在开始测试knife4j的时候,虽然接口调用成功了,但是各个接口header中的Authorition无法回填,都是undifind。直到我后来去掉外边的那层data,才回填成功

我是怎么处理的:线上正常登录用的是验证码模式。然后knife4j我用的密码模式

在token接口的实现里边,我通过模式区分,如果是验证码模式,就走原来的方法。如果是密码模式,就不做密码解密处理(为了调试方便,knife4j不就是给我们调试用的吗),而且返回的报文体也不被data包着。

3.踩坑记录

不同项目中,虽然可以有互相调用关系,但是swagger配置(knife4j) 需要各写各的。

比如我们项目是网关调用权限系统,在鉴权通过之后,才能继续调用其他的服务系统接口。

然后我们项目在权限系统中有swagger(knife4j),在服务系统中还要配置swagger(knife4j),他们各走各的,互不影响。

 knife4j当然还有其他的配置需要配,但是网上查查应该就可以解决,我这次主要是讲怎么和oauth结合的。

4.访问地址

http://localhost:1234/doc.html

5.代码当中如何配置

@Api(tags = "测试接口")
@RestController
public class SysDataSourceController {


    @ApiOperation("测试下拉选")
    @GetMapping("/type/options")
    public Result<List<Option>> getTypeOptions(){

    }
}

/**
** 请求实体
**/
@ApiModel("数据源搜索")
@Data
public class SourceQuery extends BasePageQuery {

    @ApiModelProperty("关键字(数据源名称/数据源类型 忽略大小写搜索)")
    private String keywords;

    @ApiModelProperty("数据源类型下拉选id,可多选")
    private List<String> sourceTypeIds;

    @ApiModelProperty("创建时间 正序ASC 倒序DESC 默认倒序")
    private OrderEnum orderEnum;
}
    @ApiOperation(value = "详情")
    @GetMapping("/{sourceId}")
    public Result getSourceDetail(
            @ApiParam("数据源ID") @PathVariable Long sourceId
    ) {
       
    }

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

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

相关文章

软件环境基础(ROS、CMake)

参考视频&#xff1a;【全】无人驾驶系列知识入门到提高 本文旨在对视频内容规划控制方面做一些学习记录&#xff0c;希望帮助有需要的人学习提高。不对处&#xff0c;望指正。 0 ROS介绍 ROS特点&#xff1a; 点对点设计&#xff08;比如一个结点读取相机数据&#xff0c;传…

yolo配置(windows)

文章目录 一、下载Anaconda和pycharm1 、Anaconda官方下载地址&#xff1a;1.2 Anaconda 的安装 下载好之后双击打开可执行安装文件&#xff1a;1.3 进入到安装界面&#xff1a;1.4 这里建议两个都勾选&#xff08;第一个选项是将 Anaconda 添加到环境变量中&#xff0c;不勾选…

火山引擎 ByteHouse:双十一即将到来,直播商家如何用数据“点播成金”?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 “双十一”电商大促脚步渐近&#xff0c;各大平台的战火又将燃起。直播电商以低成本、高转化率等优势备受商家青睐。据智研咨询数据显示&#xff0c;2022 年我国直播…

iOS——JSONModel的使用与JSONModel的嵌套

什么是JSONModel JSONModel是一个解析JSON数据的开源库&#xff0c;可以将JSON数据直接解析成自定义的model 使用 JSONModel 非常简单,只需要将你的 model 类继承自 JSONModel ,而同时 model 中的属性名又恰巧可以和 JSON 数据中的 key 名字一样的话,那么非常恭喜你,你的工作…

10.16作业

头文件 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include<QDebug> #include<QIcon> #include<QPushButton> #include<QLineEdit> #include<QLabel> #include<QMovie> #include<QCheckBox> #include<QPa…

MyCAT:回顾当年的热潮,探寻这款备受欢迎的数据库中间件的核心特性

什么是 MyCAT &#xff1f; 根据 MyCAT 官网 - http://mycat.io/ 的描述可以知道&#xff0c; MyCAT 是如下的一个东东&#xff1a; 一个彻底开源的&#xff0c;面向企业应用开发的大数据库集支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库…

银河麒麟你服务x86访问ftp服务器上的文件

打开我的电脑 地址栏输入 ftp地址 可以选择需要的文件复制出来了

PyQt 小程序

设备管理程序 v0.0.1.0, 终于出了一个基础版本,… … 两个字典的键值判断 辛亏用的是Python 这个编码时间大大缩短了

node+vue+mysql后台管理系统

千千博客系统&#xff0c;该项目作为一套多功能的后台框架模板&#xff0c;适用于绝大部分的后台管理系统开发。基于 vue.js&#xff0c;使用 vue-cli3 脚手架&#xff0c;引用 Element UI 组件库&#xff0c;数据库直连mysql方便开发快速简洁好看的组件。 功能包含如下&#…

电子杂志制作不求人:简单易用的工具推荐

​如果你想要制作一份精美的电子杂志&#xff0c;但是又不想花费太多的时间和金钱&#xff0c;也不想求及朋友帮忙制作&#xff0c;那么可以试试这个网站制作电子杂志&#xff0c;展现出的效果跟专业级设计师的效果没什么区别哦 赶快收藏吧-------FLBOOK在线制作电子杂志平台&a…

iOS代码混淆和加固技术详解

目录 摘要&#xff1a; 本文介绍了iOS开发中常用的代码混淆和加固技术&#xff0c;包括数据加密、应用加壳和代码混淆。其中&#xff0c;重点讨论了代码混淆的实现方法和注意事项&#xff0c;并推荐了一些相关的工具和库。 引言 代码混淆和加固 数据加密 应用加壳 代码混…

易基因:细菌微生物基因表达调控表观研究方案|原核三代甲基化+转录组

1、原核甲基化 原核生物中的DNA甲基化 原核生物甲基化为什么基于三代测序&#xff1f; 第三代DNA测序为原核细菌的甲基化和表观遗传的研究开辟了一条新的途径&#xff0c;能够在基因组的水平上获取整个表观遗传的序列信息&#xff0c;绘制全基因组甲基化组。 细菌中DNA甲基化…

使用python中xird进行读取文件以及遇到的报错

由于平日系统导出的文档均为.xls的execel&#xff0c;故本文主要讲如何使用xlrd进行读取表格以及操作过程遇到的报错以及对应解决版本 一、基本使用 准备“成绩表.xlsx”文件&#xff0c;如下&#xff1a; 1、读取文件并获得文件的sheet名字 &#xff08;1&#xff09;代码 …

Python 作为开发语言可以吗?怎么掌握 python 才能提升自己

Python 作为开发语言好吗&#xff1f;怎么掌握 python 才能提升自己&#xff1f;下面就跟小编一起来看看吧&#xff01; 很多朋友都是零基础&#xff0c;在选择编程语言的时候&#xff0c;不知道哪种语言才是适合自己去深入学习的。现在全世界有非常多的 Python 语言用户&…

精美的早安问候语,暖心祝福,开心每一天

1、 美好的祝福&#xff0c;成了清晨的主题。相互问候&#xff0c;是一天的开始。让我们伴着不老的岁月&#xff0c;永远开心快乐。早晨好&#xff01; 2、 心宽似海&#xff0c;百福皆来&#xff0c;世事看淡&#xff0c;内心安然。随缘即福&#xff0c;随遇而安&#xff0…

全局事件总线

全局事件总线 功能&#xff1a;可以解决所有组件之间通信传数据的问题原理&#xff1a;通过一个共享对象&#xff0c;将所有组件全部绑定到对象上&#xff0c;即可通过这个对象实现组件与组件之间的传递数据&#xff0c;而这个共享对象叫做全局事件总线。 如何分清楚谁是发送方…

超级干货 | 一些常用的api接口

在工作或是学习中我们经常会使用到一些api&#xff0c;这些api是该网站用于查询或者是测试的接口。有了它们&#xff0c;我们甚至不需要登录该网站就能完成自己所想的目标。今天我就将一些常用的api进行总结&#xff0c;涵盖各个方面&#xff0c;大家需要的时候翻阅使用就可以了…

易云维智慧工业云平台助力广西国企培育数字产业化平台,打造数字化产业生态

2022年6月6日&#xff0c;广西壮族自治区人民政府国有资产监督管理委员会出台了《国有企业数字化转型工作实施意见》&#xff0c;明确了总体要求、主要目标、重点推进国有企业数字化转型的任务和保障措施。 《意见》预计&#xff0c;到2025年底&#xff0c;广西基本实现自治区级…

数据加密中,采用密钥管理系统相比加密机的好处

密钥管理系统与加密机都能提供数据加解密&#xff0c;那么针对具体的应用加密&#xff0c;采用密钥管理系统比单纯使用加密机有哪些优点&#xff0c;列表如下&#xff1a; 集中化管理&#xff1a;密钥管理系统可以对加密算法和密钥进行集中化管理&#xff0c;使得企业可以对加…

宁夏企业过等保选哪家测评机构好?选哪家堡垒机好?

最近不少宁夏小伙伴在问&#xff0c;宁夏企业过等保选哪家测评机构好&#xff1f;选哪家堡垒机好&#xff1f;今天我们小编就给大家来简单说说哈&#xff01; 宁夏企业过等保选哪家测评机构好&#xff1f; 目前宁夏正规具有资质的等保测评机构只有3家&#xff0c;分别为中电信…