작성
·
883
0
안녕하세요 선생님.
스프링 부트 2.7.x 버전에서 하기 스크린샷과 같이 설정 하였을때 인증프로바이더가 중복으로 등록 되는 문제가 발생하였습니다.
하기와 같이 인증매니저를 설정을 수정하니
인증프로바이더가 정상적으로 1개 등록되었습니다.
왜 이런 일이 발생하는지 잘 이해가 되지 않아서요..
선생님께서 이유를 아신다면 설명해주시면 감사하겠습니다.
답변 1
0
공유해 주신 소스로 받으니 gradle 이 먹히지 않네요..
일단 제가 가지고 있는 비슷한 소스를 사용해서 테스트 해 보았을 때 의견을 드린다면
위의 코드 중에서
@Bean
public AuthenticationProvider authenticationProvider() {
return new ApiAuthenticationProvider(userDetailsService(), passwordEncoder());
}
가 있습니다.
현재 빈으로 정의 되어 있는데 이 부분을 빈으로 정의하지 않고 일반 객체로 생성할 경우에는 중복 추가가 안되는 것 같습니다
이건 시큐리티 내부에서 AuthenticationProvider 가 사용자 정의에 의해 빈으로 생성되어 있는지를 탐색하게 되는데 빈으로 정의되어 있으면 자동적으로 AuthenticationProvider 를 추가하고 있습니다. 이 상태에서 다시
authenticationManager.getProviders().add(authenticationProvider());
를 했으니 중복으로 추가된다고 보시면 됩니다.
그렇다면 @Bean 을 삭제하고 생성한 상태에서
authenticationManager.getProviders().add(authenticationProvider()); 을 실행하거나
아니면 빈으로 생성하고
authenticationManager.getProviders().add(authenticationProvider());
을 삭제하면 중복으로 추가되지 않을 것 같습니다
관옥님의 소스를 정확하게 실행시켜 본 것이 아니라서 저의 결과와 틀릴 수도 있으나 흐름상 원리는 비슷할 것 같습니다.
인텔리 제이에서 소스를 열면 gradle 이 비활성화 되어 있는데 깃헙 소스를 한번 확인 부탁드립니다.
답변해주셔서 감사합니다.
ApiAuthenticationProvider를 빈으로 등록하지 않고 매니저에 수동으로 등록 하여authenticationManager.getProviders().add(authenticationProvider());
테스트 하였을때는 DaoAuthenticationProvider, ApiAuthenticationProvider 등록되었고,
ApiAuthenticationProvider를 빈으로 등록하고 매니저에는 따로 등록을 안하고 테스트 했을때는ApiAuthenticationProvider만 등록되었습니다.
감사합니다
깃 헙 주소: https://github.com/GwanUk/thread_toy_project.git
브랜치: feature/users
https://github.com/GwanUk/thread_toy_project/blob/feature/users/src/main/java/com/matzip/thread/security/configs/SecurityConfig.java 링크입니다