spring security의 자동 설정에 의한 기본 보안 말고 우리가 정의한 SecurityFilterChain
을 통해 보안 기능 적용해보기
사용자 정의 보안을 적용하기 위해서는 SecurityFilterChain
타입 객체를 정의한 후 인증 및 인가 API를 설정하고 빈으로 등록해야 한다.
그래야 자동 설정에 의한 SecurityFilterChain
빈이 생성되지 않고 우리가 생성한 빈을 통해 보안 기능을 적용한다.
앞서 살펴본 것처럼 SecurityFilterChain
은 RequestMatcher
와 Filter
들을 가지고 있다.
처음에 우리는 spring security가 인증을 위해 기본으로 제공해주는 유저 정보를 확인한 적 있다.
SecurityProperties
클래스와 UserDetailsManager
클래스를 통해서 기본 유저 정보를 제공받았는데,
유저 정보를 application.yml 파일이나 자바 설정 클래스로 직접 정의할 수도 있다.
application.yml
security:
user:
name: user
password: 1111
roles: USER
설정 클래스에 bean으로 등록
@Bean
public UserDetailsService userDetailsService() {
UserDetails userDetails1 = User.withUsername("user")
.password("{noop}1111")
.roles("USER").build();
UserDetails userDetails2 = User.withUsername("user2")
.password("{noop}2222")
.roles("USER").build();
return new InMemoryUserDetailsManager(userDetails1, userDetails2);
}
두 방식 모두 설정한 경우 설정 클래스에 작성한 정보가 우선시 된다.
SecurityFilterChain
타입 빈을 등록하기 위한 설정 클래스에 @EnableWebSecurity
어노테이션을 달아주어야 한다.
그리고 모든 설정 클래스를 등록하는 부분은 모두 람다 형식으로 작성해야 한다.
import static org.springframework.security.config.Customizer.*;
@EnableWebSecurity
@Configuration
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(
auth -> auth.anyRequest().authenticated() //모든 요청은 인증을 받은 상태에서만 가능하도록 설정
)
.formLogin(withDefaults()); //인증을 위해 formLogin 방식을 사용하고 기본 설정으로 하겠다.
return http.build();
}
}
이렇게 작성하고 웹 애플리케이션을 실행하면 웹 애플리케이션에 우리가 설정한 보안 기능이 적용된다.