Swagger2配置Security授权认证全过程

Swagger2配置Security授权认证

  1. package com.ytm.yeb.config;
  2.  
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import springfox.documentation.builders.ApiInfoBuilder;
  7. import springfox.documentation.builders.PathSelectors;
  8. import springfox.documentation.builders.RequestHandlerSelectors;
  9. import springfox.documentation.service.*;
  10. import springfox.documentation.spi.DocumentationType;
  11. import springfox.documentation.spi.service.contexts.SecurityContext;
  12. import springfox.documentation.spring.web.plugins.Docket;
  13. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  14.  
  15. import Java.util.ArrayList;
  16. import java.util.List;
  17.  
  18. /**
  19.      * @author TongMing Yang
  20.      * @since 2021/1/12
  21.      */
  22.  
  23. @EnableSwagger2
  24. @Configuration
  25. public class Swagger2Config {
  26.  
  27.  
  28.  
  29.      @Bean
  30.      public Docket createRestApi() {
  31.  
  32.          return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
  33.                  // 是否开启
  34.          .enable(true).select()
  35.                  // 扫描的路径包
  36.                  .apis(RequestHandlerSelectors.basePackage(“com.ytm.yeb.controller”))
  37.                  // 指定路径处理PathSelectors.any()代表所有的路径
  38.                  .paths(PathSelectors.any()).build()
  39.                  .pathMapping(“/”)
  40.                  .securitySchemes(securitySchemes())
  41.                  .securityContexts(securityContexts());
  42.      }
  43.  
  44.      private List<ApiKey> securitySchemes() {
  45.          List<ApiKey> apiKeyList= new ArrayList();
  46.          apiKeyList.add(new ApiKey(“Authorization”, “Authorization”, “header”));
  47.          return apiKeyList;
  48.      }
  49.  
  50.      private List<SecurityContext> securityContexts() {
  51.          List<SecurityContext> securityContexts=new ArrayList<>();
  52.          securityContexts.add(
  53.                  SecurityContext.builder()
  54.                      .securityReferences(defaultAuth())
  55.                      .forPaths(PathSelectors.regex(“^(?!auth).*$”))
  56.                      .build());
  57.          return securityContexts;
  58.      }
  59.  
  60.      List<SecurityReference> defaultAuth() {
  61.          AuthorizationScope authorizationScope = new AuthorizationScope(“global”, AccessEverything”);
  62.          AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
  63.          authorizationScopes[0] = authorizationScope;
  64.          List<SecurityReference> securityReferences=new ArrayList<>();
  65.          securityReferences.add(new SecurityReference(“Authorization”, authorizationScopes));
  66.          return securityReferences;
  67.      }
  68.  
  69.      private ApiInfo apiInfo() {
  70.          return new ApiInfoBuilder()
  71.                  .title(“云E办接口文档”)
  72.                  .description(“云E办接口文档”)
  73.                  .contact(new Contact(“yeb”, “http://localhost:8081/doc.html, “ytm5021@163.com”))
  74.                  .version(“1.0”)
  75.                  .build();
  76.      }
  77. }
  78.  

-1

-2

-3

Swagger2 3.0版本相关配置和坑

Swagger2 介绍

**网上介绍:**Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。

总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法、参数和模型紧密集成到服务器端的代码,允许 API 来始终保持同步。Swagger 让部署管理和使用功能强大的 API 从未如此简单。

整合使用完整过程

1.引入依赖

  1. Swagger2 3.0由于新增了Starter 因此可以直接使用starter方式
  2. <!– https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter –>
  3.          <dependency>
  4.              <groupId>io.springfox</groupId>
  5.              <artifactId>springfoxbootstarter</artifactId>
  6.              <version>3.0.0</version>
  7.          </dependency>
  8. 在没有starter 一般都是引入以下依赖 两个依赖的版本最好一致,避免出现冲突
  9. <!– &lt;!&ndash; https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 &ndash;&gt;–>
  10. <!– <dependency>–>
  11. <!– <groupId>io.springfox</groupId>–>
  12. <!– <artifactId>springfoxswagger2</artifactId>–>
  13. <!– <version>3.0.0</version>–>
  14. <!– &lt;/dependency>–>
  15. <!– <dependency>–>
  16. <!– <groupId>io.springfox</groupId>–>
  17. <!– <artifactId>springfoxswaggerui</artifactId>–>
  18. <!– <version>3.0.0</version>–>
  19. <!– </dependency>–>

tips:推荐使用idea的插件,方便查看依赖冲突:

2.拦截配置

  1. package com.deer.primer3.config;
  2.  
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.servlet.config.annotation.*;
  6.  
  7. /**
  8.      * @author lujy
  9.      * @version 1.0
  10.      * @date 2021/2/2 12:36
  11.      */
  12. @EnableWebMvc
  13. @Configuration
  14. @Slf4j
  15. public class CorsConfig implements WebMvcConfigurer {
  16.  
  17.      @Override
  18.      public void addResourceHandlers(ResourceHandlerRegistry registry) {
  19.          registry.addResourceHandler(“/swagger-ui/**”)
  20.                  .addResourceLocations(“classpath:/META-INF/resources/webjars/springfox-swagger-ui/”)
  21.                  .resourceChain(false);
  22.      }
  23.  
  24.      @Override
  25.      public void addViewControllers(ViewControllerRegistry registry) {
  26.          registry.addViewController(“/swagger-ui/”)
  27.                  .setViewName(“forward:/swagger-ui/index.html”);
  28.      }
  29.  
  30.      //这个是跨域配置 不需要的可以不配
  31.      @Override
  32.      public void addCorsMappings(CorsRegistry registry) {
  33.          log.info(“跨域配置开启”);
  34.          registry.addMapping(“/**”)
  35.                  .allowedOriginPatterns(“*”)
  36.                  .allowedMethods(“*”)
  37.                  .allowedHeaders(“*”)
  38.                  .allowCredentials(true)
  39.                  .maxAge(3600);
  40.      }
  41. }
  42.  

3.可选配置

  1. /**
  2.      * @author lujy
  3.      * @version 1.0
  4.      * @date 2021/2/7 10:04
  5.      */
  6. @Configuration
  7. @EnableOpenApi
  8. public class SwaggerConfig {
  9.  
  10.      @Bean
  11.      public Docket createRestApi() {
  12.          return new Docket(DocumentationType.OAS_30)
  13.                  .apiInfo(api())
  14.                  .select()
  15.                  .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  16.                  .paths(PathSelectors.any())
  17.                  .build();
  18.      }
  19.  
  20.      private ApiInfo api() {
  21.          return new ApiInfoBuilder()
  22.                  .title(“Swagger3接口文档”)
  23.                  .description(“文档描述”)
  24.                  .contact(new Contact(“lujy”, “#”, “18506239610@163.com”))
  25.                  .version(“1.0”)
  26.                  .build();
  27.      }
  28.  
  29.  
  30. }
  31.  

-4

  1. new Docket(DocumentationType documentationType); 有参构造 参数 对应为 swagger版本

-5

  1. .apiInfo(api()) return —>>>Docket ApiInfoBuilder()

-6

  1. .select() —>>> return ApiSelectorBuilder

-7

  1. ApiSelectorBuilder .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))

寻找Controller层请求处理的方法中有ApiOperation的注解(个人理解)

SpringSecurity 拦截放行

-8

坑:

swagger 似乎 无法进行文件上传 测试多次 后台都报 空指针,用postman测试则没有影响

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

标签

发表评论