Uma sugestão para manter a Entidade User limpa é criar uma nova uma classe que implementa a classe UserDetails em vez de fazer a User implementar essa interface.
@Getter
public class UserDetailsImpl implements UserDetails {
private User user;
public UserDetailsImpl(User user){
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of(new SimpleGrantedAuthority("ROLE_USER"));
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getLogin();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
E no nosso UserDetailsService em vez de retornarmos um usuário (User), retornamos uma instância de UserDetailsImpl passando o usuário.
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByLogin(username).orElseThrow(() -> new RuntimeException("User not found"));
return new UserDetailsImpl(user);
}
}
O que acham dessa implementação? Desnecessária? Essencial? Depende?