Troubleshooting

Spring Security 필터로 인한 Swagger-ui.html 접속 불가

DuL2 2022. 8. 20. 22:19

TroubleShooting

발생한 문제

 스웨거 세팅을 했으나 Spring Security 필터로 인하여 스웨거 화면이 뜨지 않는 현상 발견.

해결 및 시도 방법

  1. 먼저, h2-console을 확인할 때도 비슷한 경험이 있었기에 HTTP frame option 관련인지 확인.

  • 하지만, h2-console 때문에 이미 설정했으므로 문제 없다고 판단.

 

  2. 다른 리소스들이 들어오지 않아 그림을 못그리는 것인지 확인하기 위해 개발자 콘솔을 확인.

  • localhost:8080/webjars 관련이 못들어오는 것을 확인.
  • 스웨거 리소스가 webjars에만 있을 것 같지 않아 스웨거 리소스에 대한 정보를 얻기 위해 구글링 시작함.

 

 

How to configure Spring Security to allow Swagger URL to be accessed without authentication

My project has Spring Security. Main issue: Not able to access swagger URL at http://localhost:8080/api/v2/api-docs. It says Missing or invalid Authorization header. Screenshot of the browser win...

stackoverflow.com

 

세부사항 변화

기존

기존에는 단순히 swagger-ui.html로 접근하는 url만 해제하였으나 관련 리소스들이 들어오지 않는 것을 확인하여 다른 리소스 주소도 풀어주었다.

.authorizeRequests()
.requestMatchers(request -> CorsUtils.isPreFlightRequest(request)).permitAll()
.antMatchers("/h2-console/**").permitAll()  //h2-console 해제
.antMatchers("/swagger-ui.html").permitAll()   //swagger 해제
.antMatchers("/api/signup").permitAll()   //signup 해제
.antMatchers("/api/login").permitAll()   //login 해제
.anyRequest().authenticated()

수정

swagger 관련 url 해제

.antMatchers("/swagger-ui.html",
        "/v2/api-docs",
        "/configuration/security",
        "/configuration/ui",
        "/swagger-resources/**",
        "/webjars/**").permitAll() 

결과

추가 이슈 

basic-error-controller 가 보여서 따로 apis에 any 옵션이 아닌 controller 패키지를 명시해줌.

 

@Bean
public Docket commonApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()//apis, paths를 사용하주기 위한 builder
            .apis(RequestHandlerSelectors.basePackage("com.clonecode.inssagram.controller")) // 특정 패키지경로를 API문서화 한다. 1차 필터
            .paths(PathSelectors.any()) // apis중에서 특정 path조건 API만 문서화 하는 2차 필터
            .build()
            .groupName("API 0.0.1")//빈설정에 대한 그루핑을 한 그룹에 대한 구분자 값 설정.
            .apiInfo(this.apiInfo())//스웨거 설명
            .useDefaultResponseMessages(false); // 400,404,500 .. 표기를 ui에서 삭제한다.
}

회고

 이번 트러블 슈팅은 첫 security 과제에서 h2-console 을 사용하기 위해 겪었던 트러블과 유사해 비교적 쉽게 정리하여 해결하였다. 

 

 시간을 절약했고, 빠르게 개발을 시작해야겠다.