[첫번째 프로젝트] 각종 구현체들 - WebSecurityConfigurerAdapter

노력을 즐겼던 사람·2020년 4월 2일
0

참고 문서

https://docs.spring.io/spring-security/site/docs/5.1.10.BUILD-SNAPSHOT/reference/htmlsingle/

@WebSecurityConfigurerAdapter

WebSecurityConfigurerAdapter를 extends하고 configure를 override하는 식으로 security를 configure할 수 있다.

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.authentication.builders.*;
import org.springframework.security.config.annotation.web.configuration.*;

@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());
        return manager;
    }
}

위의 코드는 실제로 WebSecurityConfigurerAdapter를 호출한다. 그리고 WebSecurityConfigurerAdapterconfigure라는 메소드를 가지고 있다.

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .and()
        .httpBasic();
}

위의 짧은 코드는 모든 요청에 authenticate가 필요하다고 설정하고 form based login을 제공하고 http basic authentication을 제공한다.
그리고 WebSecurityConfigurerAdapter를 extends하고 configure를 override할 수 있다.

Multiple HttpSecurity

WebSecurityConfigurerAdapter를 여러개 extends하여 configure를 여러개 override할 수 있다.

@EnableWebSecurity
public class MultiHttpSecurityConfig {
    @Bean                                                             1
    public UserDetailsService userDetailsService() throws Exception {
        // ensure the passwords are encoded properly
        UserBuilder users = User.withDefaultPasswordEncoder();
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(users.username("user").password("password").roles("USER").build());
        manager.createUser(users.username("admin").password("password").roles("USER","ADMIN").build());
        return manager;
    }

    @Configuration
    @Order(1)                                                        2
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            http
                .antMatcher("/api/**")                               3
                .authorizeRequests()
                    .anyRequest().hasRole("ADMIN")
                    .and()
                .httpBasic();
        }
    }

    @Configuration                                                   4
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin();
        }
    }
}

예제 코드와 같이 FormLogin에 대한 configure 따로 API에 대한 configure을 따로 정의하면 가독성과 유지보수에 더 도움이 될 것 같다.
주목할만한 점은 public static class로 정의를 하며 @Configuration annotation이 필요하다는 점인 것 같다.

profile
노력하는 자는 즐기는 자를 이길 수 없다 를 알면서도 게으름에 지는 중

0개의 댓글