webentwicklung-frage-antwort-db.com.de

Springfox swagger-ui.html kann nicht auf Basis-URL schließen - Wird durch fehlende Cookies verursacht

Wir haben unsere Spring Boot-Dienste hinter einem API-Gateway. Mit einer früheren Version von Springfox - 2.1.2 hatten wir keine Probleme beim Laden des swagger-ui.html Seite. Dies funktionierte mit Spring Boot 1.4.3.RELEASE. Von da an haben wir auf Boot 1.5.7 und Springfox auf 2.8.0 aktualisiert.

Wenn wir nun die Seite laden, erhalten wir eine Warnmeldung mit der folgenden langen Nachricht.

Basis-URL kann nicht abgeleitet werden. Dies ist häufig bei Verwendung der dynamischen Servlet-Registrierung oder wenn sich die API hinter einem API-Gateway befindet. Die Basis-URL ist die Wurzel, auf der alle Swagger-Ressourcen bereitgestellt werden. Zum Beispiel Wenn die API unter http://example.org/api/v2/api-docs verfügbar ist, lautet die Basis-URL http://example.org/api/ . Bitte geben Sie den Ort manuell ein

Ich habe einige Hinweise für die Online-Suche erhalten, aber es scheint nicht, dass diese Situationen auf uns zutreffen. Zum einen funktioniert es wieder, wenn ich die Versionen einfach zurücksetze, über dasselbe API-Gateway.

Nachverfolgung des Datenverkehrs scheint Probleme mit Aufrufen von drei XHR-Ressourcen auf der HTML-Seite zu verursachen. Diese geben 401 von unserem API-Gateway zurück. Und der Grund, warum sie 401 zurückgeben, ist, dass die Cookies nicht weitergegeben werden.

Die drei Anrufe sind:

Wenn ich diese URLs als reine Browseranforderungen lade, funktionieren sie, weil Cookies gesendet werden.

Ich bezweifle, dass CORS zutrifft, da der HTML-Code von derselben Adresse wie der Swagger-JSON und die tatsächlichen Serviceaufrufe bereitgestellt wird.

Irgendeine Idee, warum dies passieren könnte? Hat jemand ähnliche Probleme? Vorschläge zur Problemumgehung? Vielen Dank im Voraus.

18
Arnab Gupta

Fügen Sie in der Sicherheitskonfiguration folgende URLs hinzu, die zur Authentifizierung übersprungen werden:

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);
}
10
panksy2k

Das Hinzufügen der folgenden Anmerkung in der Spring Boot-Klasse hat dieses Problem für mich behoben.

@ EnableSwagger2

Ich benutze Swagger-Version

 <version>2.9.2</version>
8
Arindam

SIEHE BEARBEITEN UNTEN

Verwenden Sie Federsicherheit?

Wenn ja, überspringen Sie wahrscheinlich einige Ressourcen wie diese (richtig?): "/swagger-resources/**", "/swagger-ui.html", "/v2/api-docs", "/webjars/**"

Versuchen Sie es zu ändern "/swagger-resources/**" bis "**/swagger-resources/**".

Meine spezifische Sicherheitskonfiguration für Swagger ist:

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;
}

Wenn Sie brauchen/wollen, kann ich ein Beispielprojekt an GitHub senden, damit Sie mehr über meine Sicherheits-/Prahlerei-Konfigurationen erfahren.

EDIT 2018/04/10

Dieses Problem wird durch eine falsche Version in Springfox verursacht. Siehe dieses Problem auf Github, um das Problem zu lösen .

An die Nachwelt:

In 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>
...

Klasse, die WebSecurityConfigAdapter erweitert:

@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");
    }
}
5
Marco Blos

Dies ist mir passiert, ich habe SpringBoot 1.5.16 und Springfox 2.9.1 verwendet.

In meinem application.properties Hatte ich server.servlet-path=/api Definiert, aber irgendwie ignorierte die Prahlerei den definierten Wert. Ich habe so viele verschiedene Wege ausprobiert, um diese Arbeit zu machen, und schließlich habe ich eine Problemumgehung gefunden:

 @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/");
    }
 }

Ich habe auf http: // localhost: 8080/context/swagger-ui.html zugegriffen, aber mit dieser Konfiguration lautet die richtige URL: http: // localhost: 8080/context/api) /swagger-ui.html

4
carolnogueira

Aktualisieren Sie die Abhängigkeiten springfox-swagger2 und springfox-swagger-ui auf 2.9.2 und stellen Sie außerdem sicher, dass das basePackage ordnungsgemäß angegeben wird

return new Docket(DocumentationType.SWAGGER_2).select()
            .apis(RequestHandlerSelectors
                .basePackage("org.abc.xyz.controller"))
            .paths(PathSelectors.regex("/.*"))
            .build().apiInfo(apiEndPointsInfo());
2
Harshavardhan

In meinem Fall hatte die Ursache des Problems:

@ComponentScan(basePackageClasses = {ApplicationRoot.class })

zweimal in zwei Java Dateien.

nach dem Entfernen des zusätzlichen wurde das Problem behoben.

2
Guram Kankava

versuchen Sie es mit Port 8080 - hat bei mir funktioniert, nachdem ich es auf 8080 geändert habe

0
Pravin

Ich benutze keine Federsicherheit, ist diese Frage passiert. Mein Projekt Maven Multiple Module verwenden Wenn der Zugriff auf den localhost: 8080/swagger-ui.html diese Frage beantwortet hat, füge ich zuerst @ EnableSwagger2 in der SwaggerConf-Klasse hinzu. Zuletzt verschiebe ich @EnableSwagger in die SpringBoot-Anwendungsklasse. Diese Frage ist gelöst. Zuerst:

@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();
    }

}

Schließlich:

 @SpringBootApplication(scanBasePackages = {"com.zuoyan.springboot.appmissionhall"})
 @EnableSwagger2
public class ApplicationStartUpApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationStartUpApplication.class, args);
    }

}
0
Zuoyan

Ich fügte hinzu @EnableSwagger2WebMvc an die App-Klasse, um das Problem zu beheben. Ich verwende Spring Boot 2.3.0.BUILD-SNAPSHOT und io.springfox 3.0.0-SNAPSHOT. Die SpringFoxConfig-Klasse bleibt gleich.

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);
    }

}
0
Nditah

Wenn Sie keine speziellen Optionen für den Komponentenscan angeben, tritt dieses Problem auf, wenn Sie die Klasse mit der Annotation @ EnableSwagger2 in ein Paket einfügen, das nicht in der Hierarchie Ihrer Spring Boot Application-Klasse (@SpringBootApplication) enthalten ist.

Nehmen Sie Ihre Spring Boot Application-Klasse in "de.oopexpert.app" an und fügen Sie die mit @ EnableSwagger2 kommentierte Klasse in ...

  • de.oopexpert.app wird funktionieren
  • de.oopexpert.app.config wird funktionieren
  • de.oopexpert.config wird NICHT funktionieren

Sie können Ihre Komponenten-Scanoptionen anpassen, indem Sie @ComponentScan (basePackages = {"de.oopexpert"}) hinzufügen, um eine andere Wurzel der Hierarchie anzugeben.

0
oopexpert