인프런 커뮤니티 질문&답변

Hyeonseok Jeong님의 프로필 이미지
Hyeonseok Jeong

작성한 질문수

스프링부트 시큐리티 & JWT 강의

스프링부트 시큐리티 25강 - jwt를 위한 강제 로그인 진행

authenticationManager 관련 질문입니다.

작성

·

1.5K

·

수정됨

0

안녕하세요 늘 좋은 강의 올려주셔서 감사합니다.

authenticationManager 파라미터 전달 부분에서 문제가 있어 이렇게 게시글 남깁니다!

새로 올려주신 소스코드를 보며 새로 업데이트된 시큐리티에서 사용하기위해 authenticationManager 를 파라미터로 전달하는 부분을 적용하였습니다 그런데

Authentication authentication =
                authenticationManager.authenticate(authenticationToken);

부분에서 loadbyUsername() 함수를 호출하지 못하고 있습니다...

 

  • JwtAuthenticationFilter

// 유저네임 패스워드 토큰 생성
        UsernamePasswordAuthenticationToken authenticationToken =
                new UsernamePasswordAuthenticationToken(
                        loginUser.getUsername(),
                        loginUser.getPassword()
                );
        System.out.println("JwtAuthenticationToken : 토큰생성완료");

        // authenticate() 함수가 호출 되면 인증 프로바이더가 유저 디테일 서비스의
        // loadUserByUsername(토큰의 첫번째 파라메터) 를 호출하고
        // UserDetails를 리턴받아서 토큰의 두번째 파라메터(credential)과
        // UserDetails(DB값)의 getPassword()함수로 비교해서 동일하면
        // Authentication 객체를 만들어서 필터체인으로 리턴해준다.

        // Tip: 인증 프로바이더의 디폴트 서비스는 UserDetailsService 타입
        // Tip: 인증 프로바이더의 디폴트 암호화 방식은 BCryptPasswordEncoder
        // 결론은 인증 프로바이더에게 알려줄 필요가 없음.

        Authentication authentication =
                authenticationManager.authenticate(authenticationToken);
        System.out.println("authentication : authentication 생성 완료");
        PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
        System.out.println("Authentication : " + principalDetails.getUser().getUsername());

        return authentication;
  • SecurityConfig

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    private final CosConfig cosConfig;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);
        http.csrf(csrf -> csrf.disable());
        http.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
        http.addFilter(cosConfig.corsFilter()); // cors 허용 설정
        http.addFilterBefore(new MyFilter3(), SecurityContextPersistenceFilter.class);
        http.formLogin(login -> login.disable());
        http.httpBasic(basic -> basic.disable());
        http.addFilter(new JwtAuthenticationFilter(authenticationManager));
        http.authorizeHttpRequests(request ->
                request.requestMatchers("/api/v1/user/**")
                        .hasAnyRole("USER", "MANAGER", "ADMIN")
                        .requestMatchers("/api/v1/manager/**")
                        .hasAnyRole("MANAGER", "ADMIN")
                        .requestMatchers("/api/v1/admin/**")
                        .hasRole("ADMIN")
                        .anyRequest().permitAll()
        );

        return http.getOrBuild();
    }

 

와 같이 SecurityConfig를 업데이트된 Spring Security 독스를 보고 선생님께서 강의해주신 내용대로 만들어보았습니다.

터미널에서는

JwtAuthentication Filter : 로그인 시도중
JwtAuthenticationFilter : UserEntity(id=0, email=null, password=qwer1234, username=ssar, role=null, createDate=null)
JwtAuthenticationToken : 토큰생성완료

와 같이 JwtAuthenticationToken : 토큰생성완료 까지는 정상적으로 되는걸 확인하였습니다.

이후 loadByUsername() 부분에 따로 출력을 찍어 확인한결과 호출이 안되는걸 확인했습니다.

@Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        UserEntity userEntity = this.userDao.findByUsername(username);
        System.out.println("================ loadUserByUsername ================");
        System.out.println(userEntity);
        System.out.println("---------------- loadUserByUsername -----------------");

        return new PrincipalDetails(userEntity);
    }

 

 

어떤 부분이 잘못되어서 그런건지 찾지 못하여 게시글 남깁니다! 늘 좋은강의 감사합니다!

 

  • 개인적으로 문제점이 된다고 생각한 부분

AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);

에서 authenticationManager를 받는 부분이 제대로 안되는것 같습니다...

 

  • 추가로 SecurityConfig 에서 authenticationManager 부분을 로그로 찍어본 결과 null 출력되는걸 확인했습니다... authenticationManager부분이 생성이 안되는걸까요?

답변 1

2

구글링을 통해 해결했습니다!

혹시 다른분들도 Spring Security 6.x 로 하고싶은분이 있으실태니까 글 남겨놓겠습니다!

 

AuthenticationManagerBuilder sharedObject = http.getSharedObject(AuthenticationManagerBuilder.class);

        sharedObject.userDetailsService(this.userDetailsService);
        AuthenticationManager authenticationManager = sharedObject.build();

        http.authenticationManager(authenticationManager);

authenticationManager 생성부분을 위와같이 교채해 주시면 됩니다!

SecurityConfig에 작성하신건가요? this 에서 오류가 나네요

저도 비슷한 현상 있어서 해결했는데 여기 댓글 참고해보세요.

https://www.inflearn.com/questions/1266285

Hyeonseok Jeong님의 프로필 이미지
Hyeonseok Jeong

작성한 질문수

질문하기