Galera do futuro, se você está enfrentando problemas de erro 500 com a mensagem 'UserDetailsService returned null, which is an interface contract violation', geralmente isso ocorre quando o método loadUserByUsername do seu UserDetailsService está retornando null. Isso é uma violação do contrato da interface UserDetailsService, que exige que esse método nunca retorne null.
Se o usuário não for encontrado, o método loadUserByUsername deve lançar uma exceção UsernameNotFoundException. Tente adicionar o seguinte código:
@Service public class AutenticacaoService implements UserDetailsService {
@Autowired
private UsuarioRepository repository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserDetails user = repository.findByLogin(username);
if (user == null) {
throw new UsernameNotFoundException("User not found");
}
return user;
}
}