当前位置:   article > 正文

Knife4j添加全局请求头Authorization_knife4j设置全局请求头

knife4j设置全局请求头

 最近在项目中使用Knife4j+Sa-Token,之前是将token放在cookies中,现在要放入请求头中,借助

 Knife4j作者的文档实现此功能,参考链接OpenAPI3规范中添加Authorization鉴权请求Header不生效?

使用版本

spring boot版本:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>3.2.5</version>
  5. <relativePath/>
  6. </parent>
Knife4j版本
  1. <dependency>
  2. <groupId>com.github.xiaoymin</groupId>
  3. <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
  4. <version>4.1.0</version>
  5. </dependency>

添加自定义请求头,并添加前缀,鉴权使用Sa-Token

一、设置拦截器

  1. package com.yhx.common.config;
  2. import cn.dev33.satoken.interceptor.SaInterceptor;
  3. import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
  4. import cn.dev33.satoken.stp.StpLogic;
  5. import cn.dev33.satoken.stp.StpUtil;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  9. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  10. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  11. /**
  12. * @author: yhx
  13. * @description 注解式鉴权
  14. * @date: 2024-06-20 16:54
  15. */
  16. @Configuration
  17. public class SaTokenConfigure implements WebMvcConfigurer {
  18. @Override
  19. public void addInterceptors(InterceptorRegistry registry) {
  20. String[] excludePatterns = new String[]{"/api/v1/sys/login",
  21. "/doc.html/**",
  22. "/swagger-ui/**",
  23. "/swagger-ui.html",
  24. "/v3/api-docs/**",
  25. "/swagger-resources/**",
  26. "/webjars/**",
  27. "/swagger-ui.html/**",
  28. "/api",
  29. "/api-docs",
  30. "/api-docs/**"};
  31. // 注册 Sa-Token 拦截器,打开注解式鉴权功能
  32. registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
  33. .addPathPatterns("/**")
  34. .excludePathPatterns(excludePatterns);
  35. }
  36. @Override
  37. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  38. //配置拦截器访问静态资源
  39. registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
  40. registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/META-INF/resources/");
  41. registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
  42. }
  43. @Bean
  44. public StpLogic getStpLogicJwt() {
  45. return new StpLogicJwtForSimple();
  46. }
  47. }

主要是为了解决Knife4j被拦截器拦截问题

二、添加自定义请求头

  1. package com.yhx.common.config;
  2. import com.google.common.net.HttpHeaders;
  3. import io.swagger.v3.oas.models.Components;
  4. import io.swagger.v3.oas.models.OpenAPI;
  5. import io.swagger.v3.oas.models.info.Info;
  6. import io.swagger.v3.oas.models.security.SecurityRequirement;
  7. import io.swagger.v3.oas.models.security.SecurityScheme;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. /**
  11. * @author: yhx
  12. * @description
  13. * @date: 2024-06-21 18:41
  14. */
  15. @Configuration
  16. public class knife4jConfig {
  17. @Bean
  18. public OpenAPI customOpenAPI() {
  19. return new OpenAPI().info(new Info()
  20. .title("自定义项目名")
  21. .description("这是一个描述")
  22. .version("这是版本号"))
  23. .addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION))
  24. .components(new Components().addSecuritySchemes(
  25. HttpHeaders.AUTHORIZATION,
  26. new SecurityScheme()
  27. .name(HttpHeaders.AUTHORIZATION)
  28. .type(SecurityScheme.Type.HTTP)
  29. .scheme("Bearer")
  30. .in(SecurityScheme.In.HEADER)
  31. .bearerFormat("JWT")
  32. )
  33. );
  34. }
  35. }

需要在接口层面定义使用,如下:

@Operation(security = { @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) })

或者

  1. @SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
  2. @Operation(summary = "描述1")
  3. @PostMapping("/description")
  4. public ResponseEntity<ConfigPageParam> description(@ParameterObject ConfigPageParam configPageParam){
  5. return ResponseEntity.ok(configPageParam);
  6. }

 但是这样过于麻烦,每个接口都需要添加,所以我们可以借助Knife4j作者提供的两个接口来实现不需要手动给每个接口添加

  • GlobalOperationCustomizer:针对Operation级别的全局自定义扩展钩子函数,开发者可以对接口中每一个Operation进行扩展自定义实现,或调整,或修改,或增加扩展都行,Knife4j的部分增强特性就是基于此函数实现。
  • GlobalOpenApiCustomizer:是针对整个OpenAPI级别的,开发者在分组或者分包后,得到的单个OpenAPI实例,开发者可以操纵全局的OpenAPI实例,该OpenAPI对象已经是springdoc解析过的实例对象,例如该issues中的需求,开发者只需要自定义创建新Operation对象,然后通过OpenAPI实例对象进行add添加即可完成此需求。

三、接口自动添加

  1. package com.yhx.common.config;
  2. import com.github.xiaoymin.knife4j.annotations.ApiSupport;
  3. import com.google.common.net.HttpHeaders;
  4. import io.swagger.v3.oas.models.Operation;
  5. import io.swagger.v3.oas.models.security.SecurityRequirement;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springdoc.core.customizers.GlobalOperationCustomizer;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.web.method.HandlerMethod;
  12. import java.util.List;
  13. /**
  14. * @author: yhx
  15. * @description 为每个接口添加鉴权
  16. * @date: 2024-06-24 13:51
  17. */
  18. @Slf4j
  19. @Component
  20. public class Knife4jOperationCustomizer implements GlobalOperationCustomizer {
  21. @Override
  22. public Operation customize(Operation operation, HandlerMethod handlerMethod) {
  23. List<SecurityRequirement> security = operation.getSecurity();
  24. if (security == null) {
  25. security = List.of(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION));
  26. operation.setSecurity(security);
  27. }
  28. return operation;
  29. }
  30. }

效果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/891308
推荐阅读
  

闽ICP备14008679号