1
resposta

SpringSecurity duvida pegar id de usuario logado

Ola, eu estou tentando pegar o id do usuario logado, para criar um topico, porem sempre cai nas exceptions. eu estou recebendo o token no login e estou conectando corretamente nas outras rotas, mas cadastrar um topico novo, nao vai, justamente porque o usuario logado não funciona.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeele retorna isso no terminal dos logs

authetication: UsernamePasswordAuthenticationToken [Principal=Optional[api.forum_duvida.domain.usuario.Usuario@3c], Credentials=[PROTECTED], Authenticated=true, Details=null, Granted Authorities=[ROLE_USER]]

Usuário logado: Optional[api.forum_duvida.domain.usuario.Usuario@3c]

esse é o repository Insira aqui a descrição dessa imagem para ajudar na acessibilidade

esse a config do Security

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

como posso resolver?

1 resposta

Oii, Jonas, tudo bem?

Vou deixar aqui uma sugestão. Caso ainda tenha dificuldades, peço que me informe o curso (e a aula) ou se é um projeto pessoal, tá bem? =)

Antes de tudo, é importante garantir que o objeto Principal que você está obtendo da autenticação seja do tipo UserDetails ou um objeto que possua as informações do usuário logado. Você pode fazer um ajuste no seu código para obter o ID do usuário logado diretamente da autenticação.

Um exemplo abaixo:

public DadosDetalhamentoPostagem postar(DadosPostagem dados) {
    var authentication = SecurityContextHolder.getContext().getAuthentication();
    System.out.println("authentication: " + authentication);

    if (authentication != null && authentication.isAuthenticated()) {
        Object principal = authentication.getPrincipal();
        if (principal instanceof UserDetails) {
            UserDetails userDetails = (UserDetails) principal;
            String username = userDetails.getUsername();
            System.out.println("Usuário logado: " + username);

            Optional<Usuario> usuarioOptional = usuarioRepository.findByLogin(username);
            Usuario autor = usuarioOptional.orElseThrow(() -> new ValidacaoException("Usuário não encontrado"));

            validador.forEach(v -> v.validador(dados));

            var postagem = new Postagem(dados, autor);
            postagemRepository.save(postagem);

            return new DadosDetalhamentoPostagem(postagem);
        } else {
            throw new ValidacaoException("Usuário não autenticado");
        }
    } else {
        throw new ValidacaoException("Autenticação não encontrada");
    }
}

Ali em cima nós verificamos se o principal da autenticação é uma instância do UserDetails. Se for, obtemos o nome de usuário e, em seguida, buscamos o usuário no repositório pelo login.

Ah! E importante: veja se o seu UserDetailsService está retornando um objeto UserDetails que contenha o nome de usuário correto.

Abraços!

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