6v 아래로는 스프링 시큐리티 의존성 사용시
WebSecurityConfigurerAdapter의 authenticationManager()
AuthenticationConfiguration.getAuthenticationManager()
등을 활용했는데 6v 이상 오면서 별도의 방법이 필요합니다.
WebSecurityConfigurerAdapter 대신 SecurityFilterChain을 빈 등록해줘야하고, 해당 메소드의 파라미터인 HttpSecurity를 통해 설정에서 사용되는 공유객체를 가져와 설정할 수 있습니다.
동작 방식
- 공유 객체 검색: http.getSharedObject(AuthenticationManagerBuilder.class)는 HttpSecurity 객체 내에 공유된 AuthenticationManagerBuilder 인스턴스를 검색합니다.
- 구성 요소 설정: 검색된 AuthenticationManagerBuilder 객체를 사용하여 사용자 정의 설정을 적용합니다. 예를 들어, 사용자 세부 정보 서비스(UserService)와 비밀번호 인코더(BCryptPasswordEncoder)를 설정합니다.
- Authenticatin Manager 생성: 설정된 AuthenticationManagerBuilder 객체를 사용하여 AuthenticationManager 인스턴스를 생성합니다.
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurity {
private final UserService userService;
private final BCryptPasswordEncoder bCryptPasswordEncoder;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// AuthenticationManagerBuilder 생성
AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
authenticationManagerBuilder.userDetailsService(userService).passwordEncoder(bCryptPasswordEncoder);
// AuthenticationManager 생성
AuthenticationManager authenticationManager = authenticationManagerBuilder.build();
http.csrf(AbstractHttpConfigurer::disable);
http.authorizeHttpRequests((request) -> request
.requestMatchers(antMatcher("/actuator/**")).permitAll()
).authenticationManager(authenticationManager)
.sessionManagement((session) -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
// AuthenticationManager 활용
http.addFilter(getAuthenticationFilter(authenticationManager));
return http.build();
}
private AuthenticationFilter getAuthenticationFilter(AuthenticationManager authenticationManager){
AuthenticationFilter authenticationFilter = new AuthenticationFilter();
authenticationFilter.setAuthenticationManager(authenticationManager);
return authenticationFilter;
}
}
목적
- 객체 공유: 여러 곳에서 동일한 객체를 사용하여 일관된 설정을 유지할 수 있습니다.
- 설정 간소화: 개별적으로 객체를 생성하고 설정할 필요 없이, Spring Security가 제공하는 공유 객체를 사용하여 설정을 간소화합니다.
참고
https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter