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

Retornando 403

Ola, eu estou tendo um problema que mesmo encontrando meu usuario ainda esta retornando 403, eu debuguei a parte que traz o usuario, esta encontrando certinho mas mesmo assim ainda da o erro, segue meu codigo de autenticacao de token:

package com.example.controlefamiliabackend.config.validacao.security;

import com.example.controlefamiliabackend.models.UsuarioModel;
import com.example.controlefamiliabackend.repositories.UsuarioRepository;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigInteger;
import java.util.Optional;

public class AutenticacaoViaTokenFilter extends OncePerRequestFilter {

    final TokenService tokenService;

    final UsuarioRepository usuarioRepository;

    public AutenticacaoViaTokenFilter(TokenService tokenService, UsuarioRepository usuarioRepository) {
        this.tokenService = tokenService;
        this.usuarioRepository = usuarioRepository;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        String token = recuperarToken(request);
        filterChain.doFilter(request, response);
        boolean valido =  tokenService.isTokenValido(token);
        if (valido){
            autenticarCliente(token);
        }
    }

    private void autenticarCliente(String token) {
        BigInteger id = tokenService.getIdUsuario(token);
        Optional<UsuarioModel> usuario = usuarioRepository.findById(id);
        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                usuario, null, usuario.get().getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }

    private String recuperarToken(HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        if(token == null || !token.startsWith("Bearer ")){
            return null;
        }
        return token.substring(7, token.length());
    }
}
2 respostas
solução!

Oi Marcos,

O problema está nesse seu método:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String token = recuperarToken(request);
    filterChain.doFilter(request, response);
    boolean valido =  tokenService.isTokenValido(token);
    if (valido){
        autenticarCliente(token);
    }
}

Essa linha: filterChain.doFilter(request, response); deve ficar no final do método, pois ela interrompe a execução do filtro e chama os próximos filtros.

Show deu certinho, um detalhe ja tinha me deixado pensativo o dia todo, muito obgrigado novamente.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software