web-dev-qa-db-ja.com

Spring Boot Swagger UI-UIアクセスの保護

コードに次のクラスを追加して、既存のspringboot REST APIに単純なswagger UIを追加しました。

@EnableSwagger2
@Configuration
public class SwaggerConfig {                                    
    @Bean
    public Docket api() { 
        return new Docket(DocumentationType.SWAGGER_2)  
            .select()
            .paths(PathSelectors.regex("/v1.*"))
            .build()
            .pathMapping("/")
            .apiInfo(metadata());
    }


    private ApiInfo metadata() {
        return new ApiInfoBuilder()
          .title("My awesome API")
          .description("Some description")
          .version("1.0")
          .build();
      }
}

私の問題は、APIを公開する必要があることですが、Swaggerドキュメントは公開しないでください。 Swaggerドキュメントに認証を要求する方法が欲しいのですが、これを達成する簡単な方法は誰でも知っていますか?

私はそれをグーグルしようとしましたが、OAthのものだけを見つけることができました、しかしこれはエンドポイントの認証であり、Swaggerのドキュメントではありません...

8
Ernani

Swaggerドキュメントは、swaggerがスプリングブートアプリケーションと統合されたときに/ v2/api-docsエンドポイントで利用可能になります。

リソースを保護するために、春のセキュリティを利用し、ドキュメントにアクセスするためのエンドポイントを制限します

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

セキュリティ構成:エンドポイントへのアクセスをユーザーのみに制限

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()               
                .antMatchers("/v2/api-docs").authenticated()
                .and()
                .httpBasic();

    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

さらに、swagger-ui.htmlも要件に基づいて保護できます。

14
Barath

これが代替ソリューションです。これは、開発/ QA環境でのみswaggerへのアクセスを制限することです。本番環境ではSwaggerにアクセスできません。プロパティ(prop.swagger.enabled)開発/ qa環境でのみswagger-uiのスプリングセキュリティ認証をバイパスするフラグとして。

@Configuration
@EnableSwagger2
public class SwaggerConfiguration extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {

@Value("${prop.swagger.enabled:false}")
private boolean enableSwagger;

@Bean
public Docket SwaggerConfig() {
    return new Docket(DocumentationType.SWAGGER_2)
            .enable(enableSwagger)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.your.controller"))
            .paths(PathSelectors.any())
            .build();
}

@Override
public void configure(WebSecurity web) throws Exception {
    if (enableSwagger)  
        web.ignoring().antMatchers("/v2/api-docs",
                               "/configuration/ui",
                               "/swagger-resources/**",
                               "/configuration/security",
                               "/swagger-ui.html",
                               "/webjars/**");
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    if (enableSwagger) {
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
  }
}
0
Abdul Rahman