출처 : 개발자 유미(유튜브)
- CustomUserService에서 loadUserByUsername정의 (username으로 repsitory를 통해 DB에서 User의 정보를 가져옴 )
- 만약에 User의 정보가 존한다면 UserDetails에 User의 정보를 담아서 Authentication Manager에 전달 후 검증
즉 한 마디로,
- Spring Security를 사용하여 회원가입 시 JoinService의 joinProcess 메서드를 통해 사용자 정보를 BCrypt로 암호화하여
- UserRepository에 저장하고
- 로그인 시 LoginFilter의 attemptAuthentication 메서드에서 Authentication Manager 에 user의 정보를 전달 후
- loadUserByUsername 메서드를 통해서 username에 해당하는 user정보를 가져와서 검증 과정 진행
- 사용자 정보를 인증한 후 successfulAuthentication 메서드에서 JWT를 발급하며
- 이후 요청은 SecurityConfig에서 설정한 SecurityFilterChain을 통해 JWT를 검증하여 권한을 관리합니다.
다음은 각 번호를 구현한 코드를 제시한 것입니다.
1. Spring Security를 사용하여 회원가입 시 JoinService의 joinProcess 메서드를 통해 사용자 정보를 BCrypt로 암호화한 후
2. UserRepository에 저장
public void joinProcess(JoinDto joinDto){
String username = joinDto.getUsername();
String password = joinDto.getPassword();
Boolean isExist = userRepository.existsByUsername(username);
if(isExist){
return;
}
UserEntity data = new UserEntity();
data.setUsername(username);
data.setPassword(bCryptPasswordEncoder.encode(password));
data.setRole("ROLE_ADMIN");
userRepository.save(data);
}
3. 로그인 시 LoginFilter의 attemptAuthentication 메서드에서 Authentication Manager 에 user의 정보를 전달 후 (로그인 했을 때 입력한 정보를 전달 한 것, 4번과 헷갈리지 말자)
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
//클라이언트 요청에서 username, password 추출
String username = obtainUsername(request);
String password = obtainPassword(request);
//스프링 시큐리티에서 username과 password를 검증하기 위해서는 token에 담아야 함
//authentication Manager에게 username과 password를 던져주기 위해선 dto처럼 담아서 전달해야하는데
//UsernamePasswordAuthenticationToken이 그 역할을 함
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, password, null);
//token에 담은 검증을 위한 AuthenticationManager로 전달하여 검증함
return authenticationManager.authenticate(authToken);
}
4. loadUserByUsername 메서드를 통해서 username에 해당하는 user정보를 가져와서 검증 과정 진행
사용자가 입력한 username을 DB에서 조회 후 결과가 있다면 DB에서 조회한 결과를 CustomUserDetails 이라는 곳에 담아서 Authentication Manager에 전달
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//DB에서 조회
UserEntity userData = userRepository.findByUsername(username);
if (userData != null) {
//UserDetails에 담아서 return하면 AutneticationManager가 검증 함
return new CustomUserDetails(userData);
}
return null;
}
5. 사용자 정보를 인증한 후 successfulAuthentication 메서드에서 JWT를 발급하며
//검증 성공 시
//로그인 성공시 실행하는 메소드 (여기서 JWT를 발급하면 됨)
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authentication) {
System.out.println("성공");
}
//로그인 실패시 실행하는 메소드
@Override
protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) {
System.out.println("실패");
}
'JAVA > Spring Security JWT' 카테고리의 다른 글
JWT 발급 및 검증 클래스 (0) | 2024.07.04 |
---|---|
JWT 로그인 필터 구현 (1) | 2024.07.03 |
Security Config 설정 (0) | 2024.07.02 |