//시큐리티 /login주소 요청이 오면 낚아채서 로그인을 진행시킨다
//로그인진행이 완료되면 시큐리에 session을 만들어줍니다.(Security ContentHolder)
//오브젝트 타입 => Authentication 타입 객체
//aythentication 안에 User정보 있어야함
//User 오브젝트 타입 -> UserDetails 타입 객체
//security session -> Authentication -> UserDetails
: 인증에 성공하여 생성된 UserDetails 객체
토큰을 생성할 때 토큰의 정보로 사용될 정보와 권한 정보를 가짐
@RequiredArgsConstructor
@Getter
public class CustomUserDetails implements UserDetails {
private final User user;
@Override
// 사용자에게 부여된 권한을 GrantedAuthority 객체의 컬렉션으로 반환
public Collection<? extends GrantedAuthority> getAuthorities() {
return this.user.getRoles().stream()
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());
}
@Override
// ** 저장된 사용자의 비밀번호를 반환
public String getPassword() {
return this.user.getPassword();
}
@Override
// ** 저장된 사용자의 이메일(사용자 이름으로 사용)을 반환.
public String getUsername() {
return this.user.getEmail();
}
@Override
// ** 사용자 계정이 만료되지 않았는지 여부를 반환. (여기서는 항상 true를 반환)
public boolean isAccountNonExpired() {
return true;
}
@Override
// ** 사용자 계정이 잠기지 않았는지 여부를 반환. (여기서는 항상 true를 반환)
public boolean isAccountNonLocked() {
return true;
}
@Override
// ** 사용자의 인증 정보가 만료되지 않았는지 여부를 반환. (여기서는 항상 true를 반환)
public boolean isCredentialsNonExpired() {
return true;
}
@Override
// ** 사용자 계정이 활성화되어 있는지 여부를 반환. (여기서는 항상 true를 반환)
public boolean isEnabled() {
return true;
}
}
CustomUserDetailsService 클래스는 Spring Security의 UserDetailsService 인터페이스를 구현
JwtTokenProvider가 제공한 사용자 정보로 DB에서 알맞은 사용자 정보를 가져와 UserDetails 생성 실질적인 회원정보를 조회 하는 역할을 한다.
@RequiredArgsConstructor
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
@Override
// ** CustomUserDetailsService 의 loadUserByUsername 메서드는 사용자가 로그인을 시도할 때 Spring Security에 의해 자동으로 실행.
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// ** 인증 과정에서 사용자 이름을 통해 사용자 정보를 찾을 때 실행.
User user = userRepository.findByEmail(username).orElseThrow(
() -> new Exception401("인증되지 않았습니다.")
);
return new CustomUserDetails(user);
}
}