부록: 빈 생성 기능과 필터체인 분리

개요

간혹 필터체인에서 참조하는 컴포넌트에서 PasswordEncoder 등 필터체인이 정의된 Configuration에 정의된 Bean을 사용해야해 문제가 발생하는 경우가 있다. 바로 하위가 아니더라도 UserService라던지... 회원가입 로직에서 사용하거나 할경우 발생한 적이 많았다.

 

그래서 다음과 같이 분리하는 방법을 자주 애용한다.

@Configuration
class SecurityBeanGenerator {
    @Bean
    public UserDetailsService userDetailsService(UserRepository userRepository) {
        return username -> {
            UserEntity userEntity = userRepository.findByUsername(username)
                                                  .orElseThrow(() -> new RuntimeException(
                                                      "로그인 정보가 존재하지 않습니다."));
            return new UserWithPassword(userEntity.getId(), userEntity.getUsername(),
                userEntity.getPassword(), userEntity.getRoles());
        };
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
class SecurityConfig {

    private final ObjectMapper objectMapper;
    private final OAuth2Loader oAuth2Loader;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    }
}

https://github.com/jsween5723/spring-security-tistory/commit/278853011014309a16d2975bbfa1e549c1d1eebe

 

* 빈 생성 분리 (순환참조 해결) · jsween5723/spring-security-tistory@2788530

jsween5723 committed Aug 31, 2024

github.com