Spring

[Spring] Swagger 2.9.2 Jwt 설정 통일하는 법

퉁그리 2022. 3. 31. 17:46

그동안 jwt 설정을 apiImplicitParam을 이용해 하나하나 다 설정해주며 쓰고 있었다.

 

하지만 매함수에 항상 같은 매개변수설정이 있는것에 대한 불만이 있었고 검색을 해본 결과 2.9.2버전부터 이 문제를 개선할 수 있는 방법이 있다는 것을 알았다.

 

swaggerConfig을 다음과 같이 설정해준다.

 

@Profile({"local"})
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    private String version;
    private String title;
    private String description;

    @Bean
    public Docket swaggerTest() {

        version = "1.0.0";
        title = "SpinOff API";
        description = "테스트용";

        return new Docket(DocumentationType.SWAGGER_2)
                .useDefaultResponseMessages(false)
                .ignoredParameterTypes(MemberDetails.class)
                .ignoredParameterTypes(Pageable.class)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.ant("/api/**"))
                .build()
                .apiInfo(apiInfo(title, version, description))
                .securityContexts(List.of(securityContext()))
                .securitySchemes(List.of(apiKey()));

    }
    private ApiInfo apiInfo(String title, String version, String description) {
        return new ApiInfoBuilder()
                .title(title)
                .version(version)
                .description(description)
                .build();
    }
    private ApiKey apiKey() {
        return new ApiKey("JWT", "jwt토큰 헤더값", "header");
    }

    private SecurityContext securityContext() {
        return springfox
                .documentation
                .spi.service
                .contexts
                .SecurityContext
                .builder()
                .securityReferences(defaultAuth()).forPaths(PathSelectors.any()).build();
    }
    List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return List.of(new SecurityReference("JWT", authorizationScopes));
    }
}

그 중에 이번 jwt와 관련된 부분들은

 

swaggerTest()의 securityContexts(List.of(securityContext())), securitySchemes(List.of(apiKey()))

 

apiKey(), securityContext(), defaultAuth() 함수들이다.

 

apiKey()의 "jwt 토큰 헤더값" 부분은 각자 jwt토큰을 담는 헤더값을 넣어주면 된다.

 

그리고 나서

 

이런식으로 @AuthenticationPrincipal 나 커스텀 어노테이션으로 로그인멤버를 불러오는 항목에 대해 .ignoredParameterTypes(MemberDetails.class)를 붙여넣어주면 스웨거의 ui가 훨씬 깔끔해지고 편해진다.

 

토큰값을 넣어주면 된다.