[스프링 시큐리티] UserDetails, UserDetailsService

jjuya·2023년 12월 17일
0
post-thumbnail

//시큐리티 /login주소 요청이 오면 낚아채서 로그인을 진행시킨다
//로그인진행이 완료되면 시큐리에 session을 만들어줍니다.(Security ContentHolder)
//오브젝트 타입 => Authentication 타입 객체
//aythentication 안에 User정보 있어야함
//User 오브젝트 타입 -> UserDetails 타입 객체

//security session -> Authentication -> UserDetails

UserDetails.java

: 인증에 성공하여 생성된 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;
    }
}
  • getAuthorities() : 계정이 가지고 있는 권한목록을 리턴함
  • getPassword() : 계정의 비밀번호를 리턴
  • getUsername() : 계정의 이름을 리턴
  • isAccountNonExpired() : 계정이 만료되었는지 리턴. true는 만료되지 않음
  • isAccountNonLocked() : 계정이 잠겨있는지 리턴. true는 잠겨있지 않음
  • isCredentialsNonExpired() : 비밀번호가 만료되었는지 리턴. true는 만료되지 않음
  • isEnabled() : 계정이 활성화 되어있는지 리턴. true는 활성화 상태



UserDetailsService.java

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);
    }
}
profile
Review the Record⭐

0개의 댓글