[SPRING] spring security + swagger 사용하기
Swagger란?
로젝트 내 API를 Swagger 설정을 통해 자동으로 문서화해주는 도구로
사람이 일일이 작업할 필요 없이 프로젝트 실행을 통해
코드 내에서 변경사항(return 유형이나 parameter 수 변경 등)이 발생하여도 바로 자동으로 API문서를 만들어주므로 매우 편리한 도구이다.
또한 UI를 통해 쉽게 API 목록 조회와 API 호출을 통한 테스트(Try it out
)를 직접 해볼 수 있다.
Swagger 적용하기
1. build.gradle
dependencies{
// Swagger
implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'io.springfox:springfox-swagger-ui:3.0.0'
// Spring Security + JWT
implementation 'io.jsonwebtoken:jjwt:0.9.1'
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'
}
만약 이런 에러가 발생한다면?
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
1-1. application.yml
application.yml
에 아래 코드를 추가하자!
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
2. SwaggerConfig.java
package naem.server;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Configuration
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.OAS_30)
.useDefaultResponseMessages(true) // Swagger 에서 제공해주는 기본 응답 코드 (200, 401, 403, 404) 등의 노출 여부
.apiInfo(apiInfo()) // Swagger UI 로 노출할 정보
.select()
.apis(RequestHandlerSelectors.basePackage("naem.server.web")) // api 스펙이 작성되어 있는 패키지 (controller)
.paths(PathSelectors.any()) // apis 에 위치하는 API 중 특정 path 를 선택
.build();
}
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Swagger Test")
.description("SwaggerConfig")
.version("0.1")
.build();
}
}
문제 상황
여기까지 하고 서버를 띄운 후 http://localhost:8080/swagger-ui/로 접속해보면,
화면이 보이지 않고 please sign in 페이지가 뜬다..
3. SpringSecurityConfiguration.java
package naem.server;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(
"/v3/api-docs",
"/swagger*/**").permitAll()
.anyRequest().authenticated();
}
}
적용 확인
서버를 띄운 후 http://localhost:8080/swagger-ui/로 접속해보면 swagger-ui 화면을 볼 수 있다🙂
Ref.
- https://lemontia.tistory.com/1067 - swagger-ui 사용 시 spring security에 경로 등록
- https://blog2.deliwind.com/20201127/java-swagger-ui-3-0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/
💛 개인 공부 기록용 블로그입니다. 👻