Nous avons nos services Spring Boot derrière une passerelle API. Avec une version antérieure de Springfox - 2.1.2, nous n'avons eu aucun problème lors du chargement du swagger-ui.html
page. Cela a fonctionné avec Spring Boot 1.4.3.RELEASE. Depuis lors, nous avons mis à niveau vers Boot 1.5.7 et mis à jour Springfox vers 2.8.0.
Maintenant, si nous chargeons la page, nous obtenons une boîte d'alerte avec le long message suivant.
Impossible de déduire l'URL de base. Cela est courant lorsque vous utilisez l'enregistrement de servlet dynamique ou lorsque l'API se trouve derrière une passerelle API. L'URL de base est la racine de l'endroit où toutes les ressources swagger sont servies. Par exemple si l'api est disponible sur http://example.org/api/v2/api-docs alors l'url de base est http://example.org/api/ . Veuillez saisir l'emplacement manuellement
J'ai obtenu quelques indices en cherchant en ligne, mais il ne semble pas que ces situations s'appliquent à nous. D'une part, si je reviens simplement aux versions, cela recommence à fonctionner via la même passerelle API.
En suivant le trafic, il semble que les appels à trois ressources XHR effectués par la page .html causent des problèmes. Ceux-ci retournent 401 de notre passerelle API. Et la raison pour laquelle ils retournent 401 est parce que les cookies ne sont pas transmis.
Les trois appels sont:
Si je charge ces URL comme de simples demandes de navigateur - elles fonctionnent - car des cookies sont envoyés.
Je doute que CORS s'applique puisque le HTML est servi à partir de la même adresse que le JSON swagger et les appels de service réels.
Une idée pourquoi cela peut arriver? Quelqu'un a fait face à des problèmes similaires? Suggestions de solution? Merci d'avance.
Ajoutez la configuration de sécurité - URL suivantes qui sont ignorées pour l'authentification ::
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);
}
L'ajout d'annotations ci-dessous à la classe Spring Boot a résolu ce problème pour moi.
@ EnableSwagger2
J'utilise la version swagger
<version>2.9.2</version>
VOIR MODIFIER CI-DESSOUS
Utilisez-vous la sécurité du printemps?
Si oui, vous ignorez probablement certaines ressources comme celle-ci (non?): "/swagger-resources/**", "/swagger-ui.html", "/v2/api-docs", "/webjars/**"
Essayez de le changer "/swagger-resources/**"
à "**/swagger-resources/**"
.
Ma configuration de sécurité spécifique pour swagger est:
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;
}
Si vous avez besoin/voulez, je peux envoyer un exemple de projet à GitHub pour en savoir plus sur mes configurations de sécurité/swagger.
EDIT 2018/04/10
Ce problème est dû à une mauvaise version de springfox. Voir ce problème sur github pour résoudre le problème .
À la postérité:
Dans 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>
...
Classe qui étend 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");
}
}
Cela m'est arrivé, j'utilisais SpringBoot 1.5.16 et Springfox 2.9.1.
Dans mon application.properties
, J'avais défini server.servlet-path=/api
, mais, en quelque sorte, le swagger-ui ignorait la valeur définie. J'ai essayé tellement de façons différentes de faire fonctionner cela, et finalement j'ai trouvé une solution:
@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/");
}
}
J'accédais à http: // localhost: 8080/context/swagger-ui.html , mais avec cette configuration, l'URL correcte est: http: // localhost: 8080/context/api /swagger-ui.html
Mettez à niveau les dépendances springfox-swagger2 et springfox-swagger-ui vers 2.9.2 et assurez-vous également que le pack de base est correctement fourni.
return new Docket(DocumentationType.SWAGGER_2).select()
.apis(RequestHandlerSelectors
.basePackage("org.abc.xyz.controller"))
.paths(PathSelectors.regex("/.*"))
.build().apiInfo(apiEndPointsInfo());
Dans mon cas, la cause du problème était d'avoir:
@ComponentScan(basePackageClasses = {ApplicationRoot.class })
deux fois en deux Java.
après avoir retiré celui supplémentaire, le problème a disparu.
essayez avec le port 8080 - a fonctionné pour moi après l'avoir changé en 8080
Je n'utilise pas la sécurité du printemps est arrivé cette question. Mon projet utilise le module multiple Maven, lorsque l'accès à l'hôte local: 8080/swagger-ui.html est arrivé à cette question, j'ajoute d'abord @ EnableSwagger2 dans la classe SwaggerConf, enfin je déplace @EnableSwagger vers la classe SpringBoot Application, cette question est résolue. Première:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api(){
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.zuoyan."))
.paths(PathSelectors.any())
.build();
}
}
Finalement:
@SpringBootApplication(scanBasePackages = {"com.zuoyan.springboot.appmissionhall"})
@EnableSwagger2
public class ApplicationStartUpApplication {
public static void main(String[] args) {
SpringApplication.run(ApplicationStartUpApplication.class, args);
}
}
J'ai ajouté @EnableSwagger2WebMvc
à la classe App pour le corriger. J'utilise Spring boot 2.3.0.BUILD-SNAPSHOT et io.springfox 3.0.0-SNAPSHOT. La classe SpringFoxConfig reste la même.
package com.telixia.educare.academy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
@EnableSwagger2WebMvc
@SpringBootApplication
public class AcademyApplication {
public static void main(String[] args) {
SpringApplication.run(AcademyApplication.class, args);
}
}
Si vous ne spécifiez aucune option d'analyse de composant spéciale, vous serez confronté à ce problème si vous placez la classe avec l'annotation @ EnableSwagger2 dans un package qui n'est pas dans la hiérarchie de votre classe Spring Boot Application (@SpringBootApplication).
Supposez votre classe Spring Boot Application dans "de.oopexpert.app", puis mettez la classe annotée @ EnableSwagger2 dans ...
Vous pouvez adapter les options d'analyse de vos composants en ajoutant @ComponentScan (basePackages = {"de.oopexpert"}) pour spécifier une racine différente de la hiérarchie.