https://docs.spring.io/spring-security/site/docs/5.1.10.BUILD-SNAPSHOT/reference/htmlsingle/
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
를 호출한다. 그리고 WebSecurityConfigurerAdapter
는 configure
라는 메소드를 가지고 있다.
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할 수 있다.
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이 필요하다는 점인 것 같다.