web-dev-qa-db-ja.com

Springfox swagger-ui.htmlがベースURLを推測できない-Cookieがないために発生します

API Gatewayの背後にSpring Bootサービスがあります。 Springfoxの以前のバージョン-2.1.2では、swagger-ui.htmlページの読み込みに問題はありませんでした。これはSpring Boot 1.4.3.RELEASEで動作しました。それ以降、Boot 1.5.7にアップグレードし、Springfoxを2.8.0にアップグレードしました。

次に、ページをロードすると、次の長いメッセージを含む警告ボックスが表示されます。

ベースURLを推測できません。これは、動的サーブレット登録を使用する場合、またはAPIがAPI Gatewayの背後にある場合に一般的です。ベースURLは、すべてのSwaggerリソースが提供されるルートです。例えばAPIが http://example.org/api/v2/api-docs で利用できる場合、ベースURLは http://example.org/api/ です。 。場所を手動で入力してください

オンラインで検索するヒントをいくつか入手しましたが、それらの状況が当てはまるとは思われません。 1つは、単にバージョンを元に戻すと、同じAPIゲートウェイを介して再び機能し始めることです。

トラフィックを追跡すると、.htmlページによって行われた3つのXHRリソースへの呼び出しが問題を引き起こしているようです。これらはAPIゲートウェイから401を返しています。また、401が返されるのは、Cookieが渡されないためです。

3つの呼び出しは次のとおりです。

これらのURLを純粋なブラウザー要求としてロードすると、Cookieが送信されるため、それらは機能します。

HTMLがSwagger JSONおよび実際のサービス呼び出しと同じアドレスから提供されているため、CORSが適用されるかどうかは疑問です。

なぜこれが起こっているのでしょうか?誰かが同様の問題に直面しましたか?回避策の提案?よろしくお願いします。

18
Arnab Gupta

セキュリティ構成に追加-認証のためにスキップされる次の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);
}
10
panksy2k

春のブートクラスで以下の注釈を追加すると、この問題が解決しました。

@ EnableSwagger2

Swaggerバージョンを使用しています

 <version>2.9.2</version>
8
Arindam

以下の編集を参照してください

春のセキュリティを使用していますか?

はいの場合、おそらく次のようなリソースをスキップします(そうですか?):"/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構成について詳しく知ることができます。

EDIT 2018/04/10

この問題は、Springfoxの誤ったバージョンが原因で発生します。 問題を解決するには、githubでこの問題を参照してください

後世へ:

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

これは私に起こりました、私はSpringBoot 1.5.16とSpringfox 2.9.1を使用していました。

私のapplication.propertiesserver.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

4
carolnogueira

Springfox-swagger2とspringfox-swagger-uiの依存関係を2.9.2にアップグレードし、basePackageが適切に指定されていることを確認します

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

私の場合、問題の原因は次のとおりでした。

@ComponentScan(basePackageClasses = {ApplicationRoot.class })

2回に2回Javaファイル。

余分なものを削除した後、問題はなくなりました。

2
Guram Kankava

ポート8080で試してください-8080に変更した後、私のために働きました

0
Pravin

私は春のセキュリティを使用していませんこの質問が発生しました。私のプロジェクトではMaven Multiple Moduleを使用しています。この質問がlocalhost:8080/swagger-ui.htmlにアクセスしたとき、最初に@ EnableSwagger2をSwaggerConfクラスに追加し、最後に@EnableSwaggerをSpringBoot Applicationクラスに移動して、この質問を解決します。最初:

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

}

最終的に:

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

}
0
Zuoyan

追加した @EnableSwagger2WebMvcをAppクラスに追加して修正します。 Spring boot 2.3.0.BUILD-SNAPSHOTとio.springfox 3.0.0-SNAPSHOTを使用しています。 SpringFoxConfigクラスは同じままです。

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

特別なコンポーネントスキャンオプションを指定しない場合、Spring Boot Applicationクラス(@SpringBootApplication)の階層にないパッケージに@ EnableSwagger2アノテーションを含むクラスを配置すると、この問題が発生します。

"de.oopexpert.app"にSpring Boot Applicationクラスを想定し、@ EnableSwagger2注釈付きクラスを...

  • de.oopexpert.appが機能します
  • de.oopexpert.app.configが機能します
  • de.oopexpert.configは[〜#〜] not [〜#〜]機能します

@ComponentScan(basePackages = {"de.oopexpert"})を追加してコンポーネントスキャンオプションを調整し、階層の別のルートを指定できます。

0
oopexpert