Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Dicas para debug

Fiz todo o projeto (adaptado ao meu modelo) eu preciso de dicas de como depurar esse código (quais métodos selecionar para line breakpoint) se possível. Está autenticando, retornando o token, eu configuro o Bearer token, mas mesmo assim não autoriza acessar os endpoints (403 forbidden, access denied). De qualquer forma estou revisando aula por aula da Formação Spring Fmw. Agradeço qualquer ajuda.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
7 respostas

Oi Ian,

Nesse caso a dica é debugar o interceptor de segurança, para verificar se o token está chegando certinho e o que está acontecendo com o fluxo do código.

Ok. Vou tentar aqui, no mmt voi deixar o tópico aberto, caso encontre a solução, compartilho c a comunidade Alura ;)

Acho que tenho algo: verifiquei um erro no meu código: classe AutenticacaoViaTokenFilter,

esqueci de negar token.startsWith("Bearer ") no método:

private String recuperarToken(HttpServletRequest request) {

        String token = request.getHeader("Authorization"); //Authorization é o header Bearer sodnfowienfosdcosmocie...
        if (token == null || token.isEmpty() || !token.startsWith("Bearer ")) {
            return null;
        }
        return token.substring(7, token.length()); //isso tira a parte "Bearer " ficando só o token

    }

receebi essa exception:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

org.hibernate.LazyInitializationException: could not initialize proxy [net.felipemacedo.equipes.model.User#1] - no Session

como assim no session? Não é STATELESS nosso sistema?

Oi Ian,

Esse erro é referente à JPA.

Posta aqui o código completo da sua classe AutenticacaoViaTokenFilter para ver se tem algum outro problema.

package net.felipemacedo.equipes.config.security;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;

import net.felipemacedo.equipes.model.User;
import net.felipemacedo.equipes.repository.UserRepository;


public class AutenticacaoViaTokenFilter extends OncePerRequestFilter {

    private TokenService tokenService;

    private UserRepository repository;


    public AutenticacaoViaTokenFilter(TokenService tokenService, UserRepository repository) {
        this.tokenService = tokenService;
        this.repository = repository;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        String token = recuperarToken(request);
        System.out.println("classe AutenticacaoViaTokenFilter. token: " + token);
        boolean valido = tokenService.isTokenValido(token);
        if (valido) {
            autenticarCliente(token);
        }
        filterChain.doFilter(request, response);
    }

    private void autenticarCliente(String token) {

        Long idUser = tokenService.getIdUser(token);
        User user = repository.getOne(idUser);
        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }

    private String recuperarToken(HttpServletRequest request) {

        String token = request.getHeader("Authorization"); 
        if (token == null || token.isEmpty() || !token.startsWith("Bearer ")) {
            return null;
        }
        return token.substring(7, token.length()); 

    }

}
solução!

Oi ian,

O problema está no seu método autenticarCliente nessa linha:

User user = repository.getOne(idUser);

O problema é que o getOne não "carrega" a entidade do banco de dados e quando algum atributo dela for acessado pode dar a exception.

Altere essa linha para:

User user = repository.findById(idUser).get();

Deve resolver.

Obrigado! Foi isso mesmo.