본문 바로가기

개발일지

20231129 - UserDetails, UserDetailsService

인증 처리를 구현하면서 로그인한 사용자의 정보를 쉽게 받아오기 위해 @AuthenticationPrincipal 어노테이션을 사용했고, UserDetailsImpl 클래스를 만들어 데이터를 담아보았다.

 

1.UserDetailsImpl.java

//UserDetailsImpl.java

public class UserDetailsImpl implements UserDetails {

    private final User user;

    public UserDetailsImpl(User user) {
        this.user = user;
    }

    public User getUser() {
        return user;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        UserRoleEnum role = user.getRole();
        String authority = role.getAuthority();

        SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(simpleGrantedAuthority);

        return authorities;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

 

2.UserDetailsServiceImpl.java

// UserDetailsServiceImpl.java

@Service
@RequiredArgsConstructor
public class UserDetailsServiceImpl implements UserDetailsService {

    private final UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new UsernameNotFoundException("Not Found " + username));

        return new UserDetailsImpl(user);
    }
}

여기서 보면 UserDetailsImpl 클래스는 UserDetails 인터페이스를, UserDetailsServiceImpl 클래스는 UserDetailsService 인터페이스를 구현하고 있는 것을 볼 수 있다.

UserDetails는 Spring Security에서 사용자의 정보를 담는 인터페이스이고 UserDetailsService는 사용자의 정보를 가져오는 역할을 하는 인터페이스다.

코드를 보면 UserDetailsServiceImpl 클래스를 통해 DB에서 필요한 정보들을 가져오는 역할을 하고 있고,

UserDetailsImpl 클래스는 필요한 정보들을 오버라이딩된 메서드를 통해 담는 역할을 하고 있는 것을 볼 수 있다.