1
resposta

A implementação para criar o token passa pelas validações do Filter do token.

Estou fazendo a implementação do token JWT para fazer a parte de autenticação e percebi que após a implementação da classe de Filter, a requisição de criação do token passa por ela também, minha dúvida é se esse é um procedimento correto e habitual, ou se existe outras formas de fazer esse processo?

package br.com.forumalura.security.filter;

import java.io.IOException;

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

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

import br.com.forumalura.entity.Usuario;
import br.com.forumalura.security.TokenService;

@Filter(name = "AutenticacaoTokenFilter")
public class AutenticacaoTokenFilter extends OncePerRequestFilter {

    private static final String AUTHORIZATION_TYPE_BEARER = "Bearer ";
    private static final String AUTHORIZATION = "Authorization";
    private TokenService tokenService;


    public AutenticacaoTokenFilter(TokenService tokenService) {
        this.tokenService = tokenService;
    }

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

        String token = recuperarValidarToken(request);

        boolean tokenValido = tokenService.isTokenValido(token);

        if(tokenValido) {
            autenticarUsuario(token);
        }

        filterChain.doFilter(request, response);
    }


    // autentica o usuário atraves do token jwt
    private void autenticarUsuario(String token) {

        Long idUser = tokenService.getIdUsuario(token);
        Usuario user = tokenService.getUsuarioById(idUser);

        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(user, user.getSenha(), user.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }



    private String recuperarValidarToken(HttpServletRequest request) {
        String token = request.getHeader(AUTHORIZATION);
        if(token == null || token.isEmpty() || !token.startsWith(AUTHORIZATION_TYPE_BEARER)) {
            return null;
        }
        return token.substring(AUTHORIZATION_TYPE_BEARER.length(), token.length());
    }

}
1 resposta

Oi Gisiona,

Como essa classe foi configurada com um filter, o Spring a chamará para todas as requisições, inclusive a requisição de se autenticar e obter o token.

A princípio não tem problemas, pois o código dessa classe não realiza nenhuma operação "pesada", que poderia afetar a performance.

Mas seria possível evitar a execução da lógica dessa classe fazendo algum tratamento logo no início do método doFilterInternal.

Bons estudos!