작성
·
973
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
authenticationManager에게 위임되어 처리됩니다.
authenticate 메소드를 호출하여 내부적으로 사용자의 아이디와 비밀 번호를 확인합니다.
일치하는 정보가 있다면 Authentication 객체를 반환합니다.
아항.. 그러네요 디버그 돌려보니까
id => principal , pw => credentials 필드에 저장되네요 😅😅😅😅