首页 > 其他分享 >配置Swagger带token的三种方式

配置Swagger带token的三种方式

时间:2023-04-23 10:38:38浏览次数:47  
标签:Swagger documentation swagger token 三种 import springfox com


现在的项目基本上都是前后端分离,很多API的调用都需要用到token验证,本文就介绍怎么在swagger的header中自动添加token。

在每个接口上手动添加header

package com.morris.swagger.web;

import com.morris.swagger.vo.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("header")
@Api(tags = "为单个接口添加header")
public class HeaderController {
    @GetMapping("token")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", name = "token", required = true),
    })
    @ApiOperation("token")
    public R<Void> header() {
        return R.ok();
    }
}

启动类还是com.morris.swagger.SingleApp。

配置Swagger带token的三种方式_java

这种方法的缺点就是需要手动在每个方法上添加@ApiImplicitParam注解来指定header参数,那么有没有一种方式一次性在所有的方法上面加上header参数呢?

全局对每个API都添加header字段

重点是在原先swagger的Docket对象后面添加globalOperationParameters方法。

package com.morris.swagger;

import io.swagger.annotations.ApiOperation;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.schema.ScalarType;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.ParameterType;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import static java.util.Collections.singletonList;

@SpringBootApplication(scanBasePackages = "com.morris.swagger.*")
@EnableOpenApi //Enable open api 3.0.3 spec
public class EveryMethodTokenApp {

  public static void main(String[] args) {
    SpringApplication.run(EveryMethodTokenApp.class, args);
  }


  @Bean
  public Docket createRestApi() {

    return new Docket(DocumentationType.OAS_30)
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
            .paths(PathSelectors.regex("(?!/error.*).*"))
            .build()
            .globalRequestParameters(
                    singletonList(new springfox.documentation.builders.RequestParameterBuilder()
                            // 不能叫Authorization
                            .name("token")
                            .description("token")
                            .in(ParameterType.HEADER)
                            .required(true)
                            .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
                            .build()));
  }

  private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
            .title("Swagger API")
            .description("this is a description")
            .termsOfServiceUrl("http://springfox.io")
            .contact(new Contact("springfox", "https://morris131.github.io", "[email protected]"))
            .license("Apache License Version 2.0")
            .licenseUrl("https://github.com/springfox/springfox/blob/master/LICENSE")
            .version("3.0")
            .build();
  }

}

运行的效果如图:

配置Swagger带token的三种方式_spring boot_02

全站统一header设置

这种方案就简化了第一种方案,在swagger UI上出现一个Authorize按钮,一次输入header参数,全站使用。

package com.morris.swagger;

import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpHeaders;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.Arrays;
import java.util.List;

import static java.util.Collections.singletonList;

/**
 * 全局token
 */
@SpringBootApplication(scanBasePackages = "com.morris.swagger.*")
@EnableOpenApi //Enable open api 3.0.3 spec
public class GlobalTokenApp {

  public static void main(String[] args) {
    SpringApplication.run(GlobalTokenApp.class, args);
  }

  @Bean
  public Docket createRestApi() {
    return new Docket(DocumentationType.OAS_30)
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
            .paths(PathSelectors.regex("(?!/error.*).*"))
            .build()
            .securityContexts(Arrays.asList(securityContext()))
            // ApiKey的name需与SecurityReference的reference保持一致
            .securitySchemes(Arrays.asList(new ApiKey("token", "token", SecurityScheme.In.HEADER.name())));
  }

  private SecurityContext securityContext() {
    return SecurityContext.builder()
            .securityReferences(defaultAuth())
            //.forPaths(PathSelectors.regex("/*.*"))
            .build();
  }

  private List<SecurityReference> defaultAuth() {
    AuthorizationScope authorizationScope
            = new AuthorizationScope("global", "accessEverything");
    AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
    authorizationScopes[0] = authorizationScope;
    return singletonList(
            new SecurityReference("token", authorizationScopes));
  }

  private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
            .title("Swagger API")
            .description("this is a description")
            .termsOfServiceUrl("http://springfox.io")
            .contact(new Contact("springfox", "https://morris131.github.io", "[email protected]"))
            .license("Apache License Version 2.0")
            .licenseUrl("https://github.com/springfox/springfox/blob/master/LICENSE")
            .version("3.0")
            .build();
  }

}

全局设置完这个参数后,每个方法都会带上header参数。

配置Swagger带token的三种方式_java_03

这种方式好像不传参数也能访问接口,没法做到必填校验。

项目代码

https://gitee.com/morris131/swagger-demo


标签:Swagger,documentation,swagger,token,三种,import,springfox,com
From: https://blog.51cto.com/u_6784072/6216451

相关文章

  • mybatis-plus使用聚合函数报错---------net.sf.jsqlparser.parser.ParseException: En
    错误日志: Causedby:net.sf.jsqlparser.parser.ParseException:Encounteredunexpectedtoken:"with""WITH"atline62,column20.Wasexpectingoneof:"&""::"";""<<&q......
  • tkinter中Scale滑杆获取值的三种方法
    importtkinterastkwin=tk.Tk()win.geometry('200x200')win.title('测试窗口')'''方法一:直接使用组件对象的get()方法获取程序调用该方法时,get()会返回当前滑杆的值'''#number_scale=tk.Scale(orient=tk.HORIZONTAL)#number_scale.pack(......
  • Laravel10 简单使用 Auth 生成 Token 与登录并获取用户信息
    参考https://learnku.com/docs/laravel/10.x/authenticationmd/14876https://learnku.com/docs/laravel/10.x/sanctummd/14914https://learnku.com/articles/39646环境软件/系统版本说明windows10php8.2.5-nts-Win32-vs16-x64composer2.5.5larave......
  • session,cookie,token,jwt
    cookie,session,token,jwtCookiecookie是为了解决HTTP在状态管理上的不足,HTPP是无状态协议。目的是让服务端知道客户端的身份。cookie储存在客户端。Sessionsession是记录服务器和客户端会话状态的机制session是基于cookie实现的,session存储在服务器端,sessionid储存在客户端的co......
  • k3s 基础 —— 配置 kubernetes-dashboard 的 token 过期时间
    拉取配置到本地:kubectlgetdeploykubernetes-dashboard-nkubernetes-dashboard-oyaml>dashboard-deploy.yaml增加参数:spec:containers:-args:---auto-generate-certificates---namespace=kubernetes-dashboard---to......
  • 【汇智学堂】JSTL标签库-循环标签(forTokens)
    <c:forTokens>标签与JAVA语言中StringTokenizer类的作用相似,可以用指定的分隔符分离一个字符串,根据分隔的数量确定循环的次数。<%@pagecontentType="text/html;charset=UTF-8"language="java"%><%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c&......
  • Flink启动报错:/bin/config.sh: line 32: syntax error near unexpected token
    flink启动报错xxx@ssss:/xxx/flink-1.15.2/bin>shstart-cluster.sh/xxx/flink-1.15.2/bin/config.sh:line32:syntaxerrornearunexpectedtoken`<'/xxx/flink-1.15.2/bin/config.sh:line32:`done<<(find"$FLINK_LIB_DIR"!-ty......
  • 【汇智学堂】swagger-UI使用测试
    now,Letusbegin.1、downloadfromGitHubhttps://github.com/swagger-api/swagger-ui.git2、3、adddependency<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.......
  • 解析token中的信息 ,比如token中的userid
    介绍某些情况我们需要解析token中的信息,比如token中的用户id,方便我们后面用于查询。上一篇我们讲了如何生成token,登录鉴权,怎么验证接口权限的。接下来我们讲讲如何获取token中的信息基本思路:在过滤器中将token中的用户信息存放到context.HttpContext.User或者Thread.CurrentP......
  • JAVA获取当前时间的三种方法
    1、java.util.Dateday=newDate();SimpleDateFormatsdf=newSimpleDateFormat(“yyyy-MM-ddHH:mm:ss”);System.out.println(sdf.format(day));通过Date类来获取当前时间,比较常用。需要使用Java.util.Date类,速度一般。2、SimpleDateFormatsdf=newSimpleDateFormat......