Webflux + Swagger 적용하기

2023. 1. 17. 17:55BackEnd(Java)/Webflux

Webflux 환경에서 Swagger를 적용해보자!

 

1. Webflux에서 Swagger를 사용하기 위해서는 build.gradle에 스웨거 사용을 위해 추가를 한다.(각자 버전에 맞게 설정)

 

implementation "io.springfox:springfox-swagger2:${swaggerVersion}"
implementation "io.springfox:springfox-swagger-ui:${swaggerVersion}"
implementation "io.springfox:springfox-spring-webflux:${swaggerVersion}"
implementation "io.springfox:springfox-bean-validators:${swaggerVersion}"

 

 

2. 스웨거를 설정을 위한 Configureation 클래스를 하나 만들어 WebFluxConfigurer를 implements 한 후 스웨거 설정을 한다.

(아래 코드 참고)

@Configuration
@EnableSwagger2WebFlux
public class SwaggerConfig implements WebFluxConfigurer{
    private static final String API_NAME = "test API";
    private static final String API_VERSION = "0.0.1";
    private static final String API_DESCRIPTION = "test API 명세서";

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .useDefaultResponseMessages(false)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.test"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo())
                .genericModelSubstitutes(Optional.class, Mono.class, Flux.class);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //swagger-ui.html 리소스 등록
        registry.addResourceHandler("/swagger-ui.html**").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");

    }

    public ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(API_NAME)
                .version(API_VERSION)
                .description(API_DESCRIPTION)
                .build();
    }

}

 

 

3. 만약 스프링 시큐리티를 사용중이라면 권한을 꼭!! 추가해야한다. 아니면 500 ERROR 발생함

 

pathMatchers에 꼭 스웨거 설정 4개를 등록하여 permitAll을 해줘야 접근이 가능함!(아래 코드 참고)

(시큪리티쪽 추가안해서 1시간동안 해맸다 ㅠ)

 

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
@RequiredArgsConstructor
public class SecurityConfiguration {

    private final ReactiveAuthenticationManager authenticationManager;
    private final ServerSecurityContextRepository securityContextRepository;

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        // Disable default security.
        http.httpBasic().disable();
        http.formLogin().disable();
        http.csrf().disable();
        http.logout().disable();

        // Add custom security.
        http.authenticationManager(this.authenticationManager);
        http.securityContextRepository(this.securityContextRepository);

        // Disable authentication for `/auth/**` routes.
        http.authorizeExchange().pathMatchers("/api/**",
                        "/swagger-ui.html",         //스웨거 설정(아래 4개)
                        "/swagger-resources/**",
                        "/webjars/**",
                        "/v2/api-docs"
                        ).permitAll();
        http.authorizeExchange().anyExchange().authenticated();

        return http.build();
    }

}

 

 

4. 완성!!

 


참고자료

https://github.com/FONE1light/fone-backend/blob/main/server/src/main/kotlin/com/fone/filmone/common/jwt/WebSecurityConfig.kt

반응형