• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

AuthenticationProvider 등록 관해서 질문이 있습니다.

23.07.06 21:24 작성 조회수 635

0

안녕하세요 선생님.

스프링 부트 2.7.x 버전에서 하기 스크린샷과 같이 설정 하였을때 인증프로바이더가 중복으로 등록 되는 문제가 발생하였습니다.

설정 전체.png프로바이더 중복등록.png하기와 같이 인증매니저를 설정을 수정하니
인증프로바이더가 정상적으로 1개 등록되었습니다.
설정 수정.png프로바이더 정상등록.png왜 이런 일이 발생하는지 잘 이해가 되지 않아서요..
선생님께서 이유를 아신다면 설명해주시면 감사하겠습니다.

답변 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 이 비활성화 되어 있는데 깃헙 소스를 한번 확인 부탁드립니다.

김관욱님의 프로필

김관욱

질문자

2023.07.08

답변해주셔서 감사합니다.

ApiAuthenticationProvider를 빈으로 등록하지 않고 매니저에 수동으로 등록 하여authenticationManager.getProviders().add(authenticationProvider());
테스트 하였을때는 DaoAuthenticationProvider, ApiAuthenticationProvider 등록되었고,

ApiAuthenticationProvider를 빈으로 등록하고 매니저에는 따로 등록을 안하고 테스트 했을때는ApiAuthenticationProvider만 등록되었습니다.

감사합니다