• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

jwt 로그인시 패스워드 검증

23.06.26 18:56 작성 조회수 793

0

JWT 로그인 부분에서

username만 검증하고

password는 검증하는 부분이 안보이는거 같은데 맞나요?

  @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        System.out.println("UsernamePasswordAuthenticationFilter :: JwtAuthenticationFilter()");
        // 1. id, pw 받아서
        try {
            // x-www-form-urlencoded 로 요청시
//            BufferedReader br = request.getReader();
//            String input = null;
//            while((input = br.readLine()) != null){
//                System.out.println(input);
//            }
//            System.out.println(request.getInputStream().toString());
            // json 으로 요청시
            ObjectMapper om = new ObjectMapper();
            User user = om.readValue(request.getInputStream(), User.class);
            // 토큰 만들기
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword());
            // PrincipalDetailsService의 loadUserByUsername() 이 실행된 후 정상이면 Authentication이 리턴됨
            // DB에 있는 username과 password가 일치한다.
            Authentication authentication = authenticationManager.authenticate(authenticationToken); // 매니져가 인증을해서 Authentication 객체를 만들어줌

            PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
//            System.out.println("ㅍㅍㅍ " + principalDetails.getUser().getUsername()); // 이게 조회가 된다는건 로그인 됫다는뜻
//            System.out.println("---------------------------------");
            // authentication 객체가 Security session 영역에 저장을 해야하고 그방법이 return
            return authentication;
        } catch (IOException e) {
            e.printStackTrace(); // 에러낫을때 떠넘겨 버리면 밑에 코드가 unreacheable 되서 컴파일 에러
        }
        // 2. 정상인지 로그인 시도를 authenticationManager로 하면 PrincipalDetailsService loadUserByUsername() 가 실행됨

        // 3. PrincipalDetails 를 세션에 담고 => 세션에 값이 있어야 권한 관리가 된다. (권한관리 안할거면 세션에 안담아도 됨)

        // 4. JWT 토큰을 만들어서 응답해주면
//        System.out.println("================================");
        return null;
    }

사용자 입력(username, password)만 받아서 검증없이 Authentication 객체 만들고 있고

@Service
@RequiredArgsConstructor
public class PrincipalDetailsService implements UserDetailsService {

    private final UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("PrincipalDetaiilsService :: loadUserByUsername()");
        User userEntity = userRepository.findByUsername(username);
        System.out.println("DB Connection :: UserRepository");
        return new PrincipalDetails(userEntity);
    }
}

loadUserByUsername 에서도 username 만 받아서 엔티티 생성하는데

어디서 password 검증도 하는건지 궁금합니다.

답변 1

답변을 작성해보세요.

0

taehun kim님의 프로필

taehun kim

2023.06.27

authenticationManager에게 위임되어 처리됩니다.

authenticate 메소드를 호출하여 내부적으로 사용자의 아이디와 비밀 번호를 확인합니다.

일치하는 정보가 있다면 Authentication 객체를 반환합니다.

image아항.. 그러네요 디버그 돌려보니까
id => principal , pw => credentials 필드에 저장되네요 😅😅😅😅