Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] boas práticas

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?

1 resposta
solução!

Oi, Guilherme! Tudo bem?

Pontuação bacana, é sempre bom discutir sobre boas práticas, obrigada por fomentar o assunto aqui na nossa comunidade do fórum! A abordagem sugerida é uma prática comum e bastante útil para manter a separação de responsabilidades e a limpeza do código, pois ao criar uma classe UserDetailsImpl que implementa a interface UserDetails, estamos garantindo que a entidade User não fique sobrecarregada com responsabilidades que não são dela.

Porém, precisamos tomar cuidado quanto a necessidade da abordagem, caso a aplicação seja muito simples e a lógica de autenticação não for complexa. Em tais casos, fazer a entidade User implementar diretamente a interface UserDetails pode ser mais simples e direto.

Dessa form, respondendo diretamente à pergunta: é desnecessária? Não, definitivamente tem seus benefícios. É essencial? Depende do contexto da aplicação, pois se a lógica de autenticação é complexa e/ou se você quer manter seu código limpo e bem organizado, então sim, é essencial.

Espero ter ajudado! Caso tenha ficado alguma dúvida, sinta-se à vontade em comunicar, estou à disposição!

Um forte abraço e bons estudos!

Caso este post tenha te ajudado, por favor, marcar como solucionado ✓