我们在API网关后面有Spring Boot服务。使用早期版本的Springfox - 2.1.2,我们在加载swagger-ui.html
页面时没有遇到任何问题。这适用于Spring Boot 1.4.3.RELEASE。从那时起,我们已升级到Boot 1.5.7并将Springfox升级到2.8.0。
现在,如果我们加载页面,我们会收到一个警告框,其中包含以下长消息。
无法推断基本网址。这在使用动态servlet注册或API位于API网关后很常见。基本URL是提供所有swagger资源的根。对于例如如果api在http://example.org/api/v2/api-docs可用,那么基本网址是http://example.org/api/。请手动输入位置
我在线搜索了一些提示,但似乎这些情况并不适用于我们。首先,如果我简单地恢复版本,它将通过相同的API网关重新开始工作。
跟踪流量,似乎调用.html页面产生的三个XHR资源导致问题。这些是从我们的API网关返回401。他们返回401的原因是因为cookie没有被传递。
这三个电话是:
如果我将这些URL作为纯浏览器请求加载 - 它们可以工作 - 因为cookie是发送的。
我怀疑CORS是否适用,因为HTML是从与swagger JSON和实际服务调用相同的地址提供的。
知道为什么会这样吗?有人遇到类似问题吗?解决方法的建议?非常感谢提前。
添加安全配置 - 以下跳过身份验证的URL:::
private static final String[] AUTH_WHITELIST = {
"/swagger-resources/**",
"/swagger-ui.html",
"/v2/api-docs",
"/webjars/**"
};
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(AUTH_WHITELIST);
}
请看下面的编辑
你使用弹簧安全吗?
如果是的话,可能你会跳过这样的资源(对吧?):
"/swagger-resources/**",
"/swagger-ui.html",
"/v2/api-docs",
"/webjars/**"
尝试将它改为"/swagger-resources/**"
到"**/swagger-resources/**"
。
我对swagger的具体安全配置是:
private static final String[] AUTH_LIST = {
// -- swagger ui
"**/swagger-resources/**",
"/swagger-ui.html",
"/v2/api-docs",
"/webjars/**"
};
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().antMatchers(AUTH_LIST).authenticated()
.and()
.httpBasic().authenticationEntryPoint(swaggerAuthenticationEntryPoint())
.and()
.csrf().disable();
}
@Bean
public BasicAuthenticationEntryPoint swaggerAuthenticationEntryPoint() {
BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
entryPoint.setRealmName("Swagger Realm");
return entryPoint;
}
如果您需要/希望我可以将示例项目发送到GitHub,以便您了解有关我的安全/ swagger配置的更多信息。
编辑2018/04/10
此问题是由springfox中的错误版本引起的。 See this issue on github to solve the problem。
后人:
在pom.xml中
...
<repositories>
<repository>
<id>swagger</id>
<name>swagger</name>
<url>http://oss.jfrog.org/artifactory/oss-snapshot-local</url>
</repository>
</repositories>
...
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.1-SNAPSHOT</version>
</dependency>
...
扩展WebSecurityConfigAdapter的类:
@Configuration
public class WebSecurityConfigEntryPointApplication extends WebSecurityConfigurerAdapter {
private static final List<String> AUTH_LIST = Arrays.asList(
"/swagger-resources/**",
"/swagger-ui.html**",
"/webjars/**",
"favicon.ico");
@Autowired
private RestAuthenticationEntryPoint restAuthenticationEntryPoint;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**").authorizeRequests().anyRequest().authenticated()
.and()
.exceptionHandling()
.defaultAuthenticationEntryPointFor(swaggerAuthenticationEntryPoint(), new CustomRequestMatcher(AUTH_LIST))
.and()
.httpBasic()
.authenticationEntryPoint(restAuthenticationEntryPoint)
.and()
.csrf().disable();
}
@Bean
public BasicAuthenticationEntryPoint swaggerAuthenticationEntryPoint() {
BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
entryPoint.setRealmName("Swagger Realm");
return entryPoint;
}
private class CustomRequestMatcher implements RequestMatcher {
private List<AntPathRequestMatcher> matchers;
private CustomRequestMatcher(List<String> matchers) {
this.matchers = matchers.stream().map(AntPathRequestMatcher::new).collect(Collectors.toList());
}
@Override
public boolean matches(HttpServletRequest request) {
return matchers.stream().anyMatch(a -> a.matches(request));
}
}
}
RestAuthenticationEntryPoint:
@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
}
}
在spring boot class中添加以下注释为我解决了这个问题。
@ EnableSwagger2
我正在使用招摇版
<version>2.9.2</version>
这发生在我身上,我使用的是Spring Boot 1.5.16和Springfox 2.9.1。
在我的application.properties
中,我定义了server.servlet-path=/api
,但不知何故,swagger-ui忽略了定义的值。我已经尝试了很多不同的方法来完成这项工作,最后我找到了一个解决方法:
@Configuration
@EnableSwagger2
public class SwaggerConfiguration extends WebMvcConfigurationSupport {
@Bean
public Docket apiMonitoramento() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("REST API")
.description("Servicesx")
.build();
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
我正在访问http://localhost:8080/context/swagger-ui.html,但使用该配置正确的URL是:http://localhost:8080/context/api/swagger-ui.html