• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

jwt를통해 로그인을할때 User가 null값이 되어오류납니다

24.02.16 16:45 작성 24.02.16 16:47 수정 조회수 234

0

java.lang.NullPointerException: Cannot invoke

"filesource.project16.model.SiteUser.getPassword()" because "this.siteUser" is null

at filesource.project16.auth.PrincipalDetails.getPassword(PrincipalDetails.java:24) ~[main/:na]

 

로그인할때 db에있는 올바른 username, password를 입력하였는데 이런 오류가 뜨네요.

 

jwt의 토큰을 거치면서 username, password 정보가 null값이 되어버리는거 같은데,

보통 어디에 문제가있어서 이러는걸까요?

 

auth, jwt 폴더의 파일은 수정하지않고 원본그대로 썼습니다.

 

 

 

@EnableWebSecurity  //모든 요청URL이 스프링 시큐리티의 제어를 받도록함.    기본 스프링 필터체인에 등록
@Configuration
public class SecurityConfig {

    @Autowired
    private CorsConfig corsConfig;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public SecurityFilterChain configure(HttpSecurity http) throws Exception {



        AuthenticationManagerBuilder sharedObject = http.getSharedObject(AuthenticationManagerBuilder.class);
        sharedObject.userDetailsService(userDetailsService);
        AuthenticationManager authenticationManager = sharedObject.build();

        http.authenticationManager(authenticationManager);



        http
                .csrf(csrf -> csrf.disable())
                .httpBasic(basic -> basic.disable())
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))


                .addFilter(corsConfig.corsFilter())     // cors 허용 설정

                .addFilter(new JwtAuthenticationFilter(authenticationManager))
                .addFilter(new JwtAuthorizationFilter(authenticationManager, userRepository))



                .authorizeHttpRequests(requests -> requests
                                .requestMatchers("/**").permitAll()     //비로그인 접근가능페이지

                                .anyRequest().authenticated()       //이상제외는 로그인필수
                )

                .formLogin(form -> form
                        .loginPage("/login")           //자동적으로 로그인페이지로감. 로그인페이지로 취급될주소
                        .defaultSuccessUrl("/main", true)   //로그인 성공시 루트 url
                        .permitAll()
                )
                .logout(logout -> logout.permitAll());


        return http.build();
    }

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }


}

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.02.17

안녕하세요, 인프런 AI 인턴입니다.

NullPointerException이 발생하는 경우는 주로 참조하려는 객체가 null로 초기화되어 있거나 아직 적절히 생성되지 않았을 때입니다. 문제가 발생한 PrincipalDetails 클래스 내에서 this.siteUser 객체가 null인 상태로 메서드가 호출되어 오류가 발생한 것으로 보입니다.

제공해주신 코드에는 UserDetailsService를 사용하여 사용자 정보를 가져오는 부분이 포함되어 있지만, PrincipalDetails으로 사용자 정보를 불러오는 구체적인 코드는 포함되어 있지 않습니다. 다만, 여기에서 문제가 발생하였다는 것은 사용자 정보를 불러오는 과정에서 예상치 못한 문제가 있을 가능성이 있습니다.

해결을 위해 다음 단계를 확인해보시면 좋을 것 같습니다:

  1. UserDetailsService의 구현부를 살펴봅니다. loadUserByUsername 메서드가 올바르게 구현되었는지, 특히 데이터베이스에서 사용자 정보를 정상적으로 조회하여 UserDetails 객체를 반환하는지 확인이 필요합니다.

  2. JwtAuthenticationFilter에서 AuthenticationManager를 통해 로그인 처리를 할 때 PrincipalDetails가 정상적으로 생성되고, 사용자 정보(siteUser)를 포함하고 있는지 확인합니다.

  3. 문제의 원인이 되는 PrincipalDetails.getPassword() 메서드 호출 부분에서, 해당 메서드가 호출되기 전에 PrincipalDetails 객체의 siteUser 가 정상적으로 초기화되었는가를 검토합니다.

  4. 데이터베이스 연결 상태나, 사용자 정보 조회 쿼리가 정상적으로 작동하는지 확인합니다.

  5. 오류가 발생하는 시점의 로그 또는 스택 트레이스를 상세히 분석합니다.

PrincipalDetails 클래스와 해당 클래스를 사용하는 필터들의 정확한 구현 코드를 검토하지 않고는 구체적인 해결책을 제시하기 어렵습니다. 그러나 위에서 제시한 단계를 통해 문제점을 찾아보시는 것을 추천드립니다. 필요한 경우, AuthenticationManager 혹은 UserDetailsService가 정상적으로 빈으로 등록되었는지도 확인해보세요.