当前位置: 首页 > news >正文

SpringBoot集成swagger2配置权限认证参数

作者简介:大家好,我是撸代码的羊驼,前阿里巴巴架构师,现某互联网公司CTO

联系v:sulny_ann(17362204968),加我进群,大家一起学习,一起进步,一起对抗互联网寒冬


在使用swagger2时,如果api接口需要token等权限认证内容,那么此时可以有两种方案进行解决:方案一,每个请求上面都添加对应token的key和value值。方案二:全局统一添加权限认证的token。

一般情况下token都存放在header中。


引入swagger2依赖

引入对应的swagger2依赖:

<dependency>    <groupId>io.springfox</groupId>    <artifactId>springfox-swagger2</artifactId>    <version>2.9.2</version></dependency><dependency>    <groupId>io.springfox</groupId>    <artifactId>springfox-swagger-ui</artifactId>    <version>2.9.2</version></dependency>


集成配置方案一

首先我们来看第一种方案,也就是每个请求都添加对应header信息,对应的config文件配置如下:​​​​​​​

import com.google.common.collect.Lists;import io.swagger.annotations.ApiOperation;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.ParameterBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.schema.ModelRef;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.EnableSwagger2;
import java.util.ArrayList;import java.util.Collections;import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
@Configuration@EnableSwagger2public class SwaggerConfig {  @Bean  public Docket createRestApi() {    ParameterBuilder parameterBuilder = new ParameterBuilder();    List<Parameter> parameters = Lists.newArrayList();    parameterBuilder        .name("token")        .description("token令牌")        .modelRef(new ModelRef("String"))        .parameterType("header")        .defaultValue("")        .required(false).build();    parameters.add(parameterBuilder.build());
    return new Docket(DocumentationType.SWAGGER_2)        .apiInfo(apiInfo())        .select()        //加了ApiOperation注解的类,才生成接口文档        .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))        //包下的类,才生成接口文档        .apis(RequestHandlerSelectors.basePackage("com.chengdeshi.controller"))        .paths(PathSelectors.any())        .build()        .globalOperationParameters(parameters)        .securitySchemes(security());  }
  private ApiInfo apiInfo() {    return new ApiInfoBuilder()        .title("文档")        .description("文档")        .termsOfServiceUrl("https://www.choupangxia.com")        .version("4.0.0")        .build();  }
  private List<ApiKey> security() {    return newArrayList(        new ApiKey("token", "token", "header")    );  }
}

重点是构建了ParameterBuilder对象,并通过globalOperationParameters将其配置到Docket中。

此时展示效果如下: 

执行每个接口请求时都需要添加token值,除非写死默认值。


集成配置方案二

如果不想每次都填写这么一个token字段,每次都手动进行填写。那么可以通过统一全局配置。

对应的配置文件配置如下:​​​​​​​

import io.swagger.annotations.ApiOperation;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.service.ApiInfo;import springfox.documentation.service.ApiKey;import springfox.documentation.service.AuthorizationScope;import springfox.documentation.service.SecurityReference;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spi.service.contexts.SecurityContext;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;import java.util.Collections;import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
@Configuration@EnableSwagger2public class SwaggerConfig {  @Bean  public Docket createRestApi() {    return new Docket(DocumentationType.SWAGGER_2)        .apiInfo(apiInfo())        .select()        //加了ApiOperation注解的类,才生成接口文档        .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))        //包下的类,才生成接口文档        .apis(RequestHandlerSelectors.basePackage("com.chengdeshi.controller"))        .paths(PathSelectors.any())        .build()        .securityContexts(securityContexts())        .securitySchemes(security());  }
  private ApiInfo apiInfo() {    return new ApiInfoBuilder()        .title("文档")        .description("文档")        .termsOfServiceUrl("https://www.choupangxia.com")        .version("4.0.0")        .build();  }
  private List<ApiKey> security() {    return newArrayList(        new ApiKey("token", "token", "header")    );  }
  private List<SecurityContext> securityContexts() {    return new ArrayList(        Collections.singleton(SecurityContext.builder()            .securityReferences(defaultAuth())            .forPaths(PathSelectors.regex("^(?!api).*$"))            .build())    );  }
  List<SecurityReference> defaultAuth() {    AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");    AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];    authorizationScopes[0] = authorizationScope;    return new ArrayList(        Collections.singleton(new SecurityReference("token", authorizationScopes)));  }
}

此时重点是配置了Docket的securityContexts,通过该配置,设置了一个全局的变量“global”。注意defaultAuth方法中SecurityReference的第一个参数为你使用的token的key,我这里使用token。

此种方案展示效果如下:

在右上角会出现一个Authorize的选项。 

点击“Authorize”,弹出下图。 

在图中value的地方填写对应的token值,点击个Authorize。随后使用任何接口时都会在header部分添加对应token值。


​​​​​​​小结

当然上述是以token为例进行讲解的,如果你想通过header传输其他参数,也可以借鉴此方法。在此实例中大家切勿全部copy,在具体场景下需要修改对应的参数值来进行使用。

相关文章:

  • 《地理信息系统原理》笔记/期末复习资料(13. 地理信息系统的发展趋势)
  • 持续集成交付CICD:使用Maven命令上传Nexus制品
  • 多合一iPhone 解锁工具:iMyFone LockWiper iOS
  • 专栏十五:omicverse在单细胞分析中的实际使用体验和小改动
  • 利用python编写简易POC脚本
  • KMP算法数组下标从0和数组下标从1开始
  • Windows 批量删除文件简单方法
  • k8s 安装 Longhorn
  • Java设计模式-单例(Singleton)设计模式的概述及实现
  • 〖大前端 - 基础入门三大核心之JS篇(51)〗- 面向对象之认识上下文与上下文规则
  • 【JVM】第一章:内存结构
  • ES6之Symbol
  • FFmpegd的AVBSF
  • 学习Node.js与Webpack总结
  • C++之函数指针
  • 深入了解以太坊
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【RocksDB】TransactionDB源码分析
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Codepen 每日精选(2018-3-25)
  • Create React App 使用
  • ES6系列(二)变量的解构赋值
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • mongodb--安装和初步使用教程
  • PHP的Ev教程三(Periodic watcher)
  • Travix是如何部署应用程序到Kubernetes上的
  • 阿里研究院入选中国企业智库系统影响力榜
  • 前言-如何学习区块链
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 微信小程序--------语音识别(前端自己也能玩)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 1.Ext JS 建立web开发工程
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 进程与线程(三)——进程/线程间通信
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # .NET Framework中使用命名管道进行进程间通信
  • # C++之functional库用法整理
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (12)Hive调优——count distinct去重优化
  • (7)摄像机和云台
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ./configure、make、make install 命令
  • .java 9 找不到符号_java找不到符号
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net MVC中使用angularJs刷新页面数据列表
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • @ConfigurationProperties注解对数据的自动封装
  • @javax.ws.rs Webservice注解
  • @ModelAttribute使用详解
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?