JHipster7.0.1网关引入Springfox后无法读取微服务Swagger文档怎么办
JHipster 7网关集成Springfox3后访问下游微服务文档401问题解决方案
问题根因
- JHipster 7默认网关的Spring Security规则会拦截所有
/services/**路径的请求,要求携带有效认证凭证,Swagger UI发起v3/api-docs请求时默认未携带凭证,触发401未授权错误 - 下游微服务自身的安全配置也可能拦截
/v3/api-docs路径的匿名访问
解决方案
方案一:匿名放行api-docs相关路径(最简便,适合开发环境)
- 调整网关的
SecurityConfiguration.java配置,在权限校验规则最前方添加api-docs相关路径的放行规则:
@Override public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { http // 其他原有配置 .authorizeExchange() .pathMatchers("/services/*/v3/api-docs", "/v3/api-docs", "/swagger-ui/**", "/swagger-resources/**").permitAll() // 其余原有权限校验规则,比如.anyExchange().authenticated() // 其他后续配置 return http.build(); }
注意:放行规则必须放在需要身份认证的通用规则之前,否则不会生效
2. 调整所有下游微服务的安全配置,同样放行/v3/api-docs路径的匿名访问。
方案二:配置Swagger全局认证(适合生产环境,不需要匿名放行业务路径)
如果不希望api-docs路径对外匿名暴露,可以配置Springfox的全局认证规则,让Swagger UI自动携带登录后的JWT凭证发起请求:
- 在网关的Springfox配置类中添加安全方案和安全上下文配置:
@Configuration public class SpringfoxConfig { @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .securityContexts(Collections.singletonList(securityContext())) .securitySchemes(Collections.singletonList(apiKey())) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build(); } private SecurityContext securityContext() { return SecurityContext.builder() .securityReferences(defaultAuth()) .operationSelector(op -> true) .build(); } private List<SecurityReference> defaultAuth() { AuthorizationScope scope = new AuthorizationScope("global", "全局访问权限"); return Collections.singletonList(new SecurityReference("Authorization", new AuthorizationScope[]{scope})); } private ApiKey apiKey() { return new ApiKey("Authorization", "Authorization", "header"); } }
- 配置完成后打开Swagger UI,点击页面上的
Authorize按钮,输入Bearer <登录后获取的JWT令牌>并确认,之后再点击微服务条目就会自动携带token发起请求,不会再触发401错误。
验证
完成配置后重启网关和下游微服务,打开Swagger UI点击对应微服务条目,即可正常加载接口文档。
内容的提问来源于stack exchange,提问作者jodelus le
相关产品推荐
相关产品推荐

