Security Config에 설정한대로 LoginForm을 통해 날라오는 로그인 요청에 대해 Security가 검증을 하게된다.
UserDetailsService
와 UserDetails
을 구현해 주어야 DB에 저장된 회원 정보로 부터 아이디 검증을 진행할 수 있다.
Spring Security에서 유저의 정보를 가져오는 인터페이스다.
@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements **UserDetailsService** {
private final UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User userData = userRepository.findByUsername(username);
if (userData != null) {
return new CustomUserDetails(userData);
}
return null;
}
}
UserRepository
를 주입해준다.UserDetailsService
를 implements해준 후 필수로 구현해야 하는 loadUserByUsername
메서드 를 구현해준다.Spring Security에서 사용자 정보를 담는 인터페이스다.
데이터베이스로 부터 특정한 userName에 대한 데이터를 가져오고 해당 데이터를 userDetails 클래스에 넣어서 SecurityConfig에 전달해 주면 SecurityConfig에서 userName에 대한 password, role 들을 검증하고 완료시 스프링 세션에 저장해서 사용자 접근 허용해준다.
→ DTO에 해당하는 역할을 한다.
public class CustomUserDetails implements **UserDetails** {
private User user;
public CustomUserDetails(User user){
this.user = user;
}
// 사용자의 특정한 권한에 대해 return 해주는 메서드 (ex role 값)
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collection = new ArrayList<>();
collection.add(new GrantedAuthority() {
@Override
public String getAuthority() {
return user.getUserRole().getValue();
}
});
return collection;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getName();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}