2020. 3. 23. 17:01ㆍSpring/Spring Boot Tutorial
REST API Versioning
- api url 분리 및 package 분리
- api url spring security permitAll 설정
- 실행화면
api 와 view를 함께 제공하는 spring 웹 애플리케이션에서, 관리의 용이함과 기능적 편리함을 위해 api controller 패키지를 별도로 분리하는 것이 좋습니다.
또한, 추후 api의 대대적인 수정이 이뤄질 때, api 버전이 올라가는 것을 대비하여 api버전별로 설정해두는 것을 권장합니다.(Versioning)
이번 포스팅에서는 api 관련 컨트롤러를 controllers/api/v1 에 위치시키며, 각 api 컨트롤러의 url 공통적 prefix를 설정합니다.
1. api url 분리 및 package 분리
demo: api: /api/v1
프로퍼티에 rest api prefix를 설정합니다.
package me.jiniworld.demo.controllers.api.v1; ... @RequestMapping(value = "${demo.api}/users") @RequiredArgsConstructor @RestController public class UserController { }
demo.api
에 설정했던 url prefix를 ${} 를 이용하여 읽어옵니다.
클래스 내에 정의했던 모든 RequestMapping 요청들은 앞으로 /api/v1/users
, /api/v1/users/1
과 같이 prefix가 붙습니다.
2. api url spring security permitAll 설정
api는 관리자 로그인 없이 모두가 접근가능하도록 하기 위해 WebSecurityConfigurerAdapter 구현 클래스에 url설정을 추가합니다.
@RequiredArgsConstructor @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ... @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/login", "/join", "/api/v1/**").permitAll() .antMatchers("/v/users").hasRole("ADMIN") .antMatchers("/v", "/v/**").hasRole("VIEW") .anyRequest().authenticated() .and() .formLogin().loginPage("/login").defaultSuccessUrl("/v", true) .usernameParameter("email").passwordParameter("password") .and() .logout().invalidateHttpSession(true).deleteCookies("JSESSIONID") .and().exceptionHandling().accessDeniedHandler(webAccessDeniedHandler) .and() .authenticationProvider(authenticationProvider()) .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); } }
ln 11 : /api/v1/**
url의 경우 permitAll() 설정합니다.
ln 14 : 별도로 설정하지 않은 url은 인증된 사용자만 접근할 수 있도록 합니다.
ROLE_VIEW
권한을 가지고 있을 경우 접근할 수 있도록 설정하는 방법은 총 3가지 입니다.
- .hasAuthority("ROLE_VIEW")
- .access("hasRole('ROLE_VIEW')")
- .hasRole("VIEW")
hasRole은 role_name의 prefix가 **ROLE_**일 경우 사용하는 메서드로, 자동으로 prefix를 붙여서 권한 보유 여부를 체크합니다.
3. 실행화면
api prefix를 붙여서 rest api get 메서드를 실행한 결과 입니다.
앞으로 api controller를 추가할 경우에도 마찬가지로 컨트롤러의 requestMapping에 ${demo.api}
를 붙입니다.
추후, api가 크게 변경될 필요가 있을 때엔, 기존의 api를 그대로 두고 api/v2 prefix 설정한 api를 생성하면 됩니다.
※ GitHub에서 demo 프로젝트를 다운받아 볼 수 있습니다.
'Spring > Spring Boot Tutorial' 카테고리의 다른 글
[Spring Boot Tutorial] 13. OpenAPI 3.0를 이용한 REST API 문서 만들기 (Swagger v3) (6) | 2020.06.18 |
---|---|
[Spring Boot Tutorial] 12. Spring Boot REST Api에 ResponseEntity 적용하기 (2) | 2020.04.22 |
[Spring Boot Tutorial] 10. 회원가입 화면 만들기 (6) | 2020.03.11 |
[Spring Boot Tutorial] 9. JDBC 기반 Spring Security 인증&인가 (0) | 2020.01.31 |
[Spring Boot Tutorial] 8. AccessDeniedHandler 구현클래스로 인증&인가 Exception 핸들링 (0) | 2019.12.12 |