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.

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.