コードに次のクラスを追加して、既存の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のドキュメントではありません...
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も要件に基づいて保護できます。
これが代替ソリューションです。これは、開発/ 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/");
}
}
}