Swagger3测试Bearer token接口返回401、Postman正常该如何配置?
Swagger3 Bearer Token 401问题解决方案
问题根因
你已排查出核心问题是Swagger发起请求时,Authorization请求头只传入了token值,未自动拼接Bearer 前缀,导致后端鉴权逻辑解析失败返回401。
解决方案:修改Swagger配置类
需要在原有SwaggerConfig.java的Docket Bean配置中补充安全模式和安全上下文配置,完整修改后代码如下:
/** * Configuration settings for Swagger */ @Configuration public class SwaggerConfig { @Autowired BuildProperties buildProperties; @Value("${swagger-docs.host}") String host; @Value("${swagger-docs.protocols}") String protocols; @Bean public Docket api(){ return new Docket(DocumentationType.SWAGGER_2) // 完全适配Swagger3可改为 DocumentationType.OAS_30 .apiInfo( new ApiInfoBuilder() .title(buildProperties.getName()) .version(buildProperties.getVersion()) .build()) .host(host) .protocols(new HashSet<>(Arrays.asList(protocols.split(",")))) .useDefaultResponseMessages(false) // 新增安全配置开始 .securitySchemes(securitySchemes()) .securityContexts(securityContexts()) // 新增安全配置结束 .select() .apis(RequestHandlerSelectors.basePackage("com.demo.example")) .paths(PathSelectors.any()) .build() .tags(new Tag("API", "API Demo Example")); } // 配置认证规则:指定从header的Authorization字段获取token,自动拼接Bearer前缀 private List<SecurityScheme> securitySchemes() { ApiKey apiKey = new ApiKey("JWT", "Authorization", "header"); return Collections.singletonList(apiKey); } // 配置认证规则生效范围:所有接口都生效 private List<SecurityContext> securityContexts() { return Collections.singletonList( SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.any()) .build() ); } // 配置全局认证权限范围 private List<SecurityReference> defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] scopes = new AuthorizationScope[1]; scopes[0] = authorizationScope; return Collections.singletonList(new SecurityReference("JWT", scopes)); } }
生效验证
配置完成重启项目后,打开Swagger UI页面按以下步骤操作:
- 点击页面右上角的
Authorize按钮 - 在弹出框的输入框中直接填写token值(不需要手动加
Bearer前缀) - 点击
Authorize保存后再调用接口,即可正常携带符合要求的Authorization请求头,返回200响应
内容的提问来源于stack exchange,提问作者Kurtiss
相关产品推荐
相关产品推荐

