1
resposta

Entender melhor sobre interceptor e adicionar swagger no projeto

Olá, queria entender melhor como permitir e bloquear, porque eu não entendi muito bem a parte de retornar null (recuperarToken) no filter e o uso do dofilter. Tentei fazer permitir, porém somente com o endereço ele continua bloqueando e não achei nada que me ajudasse a entender: No arquivo TokenService não fiz alteração.

@Configuration
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.oracleone.forumhub"))
                .paths(PathSelectors.any())
                .build();
    }
}
@Component
public class SecurityFilter extends OncePerRequestFilter {

    @Autowired
    private TokenService tokenService;

    @Autowired
    private UsuarioRepository repository;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String requestURI = request.getRequestURI();

        // Ignorar validação de token para Swagger
        if (requestURI.startsWith("/v3/api-docs") || requestURI.startsWith("/swagger-ui")) {
            filterChain.doFilter(request, response);
            return;
        }

        var tokenJWT = recuperarToken(request);
        if (tokenJWT != null) {
            var subject = tokenService.getSubject(tokenJWT);
            var usuarioOptional = repository.findByLogin(subject);

            if (usuarioOptional.isPresent()) {
                var usuario = usuarioOptional.get();
                var authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }

        filterChain.doFilter(request, response);
    }

    private String recuperarToken(HttpServletRequest request) {
        var authorizationHeader = request.getHeader("Authorization");
        if (authorizationHeader != null) {
            return authorizationHeader.replace("Bearer ", "").trim();
        }

        return null;
    }
}
1 resposta

Olá Gisele! Tudo bem?

Vamos abordar cada parte para tentar esclarecer suas dúvidas.

Sobre o doFilter e recuperarToken

No seu SecurityFilter, o método doFilterInternal é responsável por interceptar as requisições e aplicar a lógica de segurança. O método recuperarToken tenta extrair o token JWT do cabeçalho "Authorization" da requisição. Se o token não estiver presente, recuperarToken retorna null, o que significa que a requisição não possui um token válido para autenticação.

A lógica que você implementou no doFilterInternal verifica se a URL requisitada é relacionada ao Swagger (/v3/api-docs ou /swagger-ui). Para essas URLs, você está permitindo o acesso sem validação de token, chamando filterChain.doFilter(request, response) e retornando imediatamente. Isso é importante para que a documentação do Swagger esteja acessível sem autenticação.

Para outras URLs, o filtro tenta recuperar o token JWT e, se bem-sucedido, autentica o usuário. Após isso, filterChain.doFilter(request, response) é chamado para continuar o processamento da requisição.

Sobre o Swagger

A configuração do Swagger que você adicionou parece correta. O Docket está configurado para escanear o pacote base com.oracleone.forumhub e expor todas as rotas. Certifique-se de que as dependências do Swagger estão corretamente adicionadas ao seu pom.xml ou build.gradle.

Possíveis Problemas

  1. Token não sendo passado: Verifique se o cliente que faz a requisição está passando o cabeçalho "Authorization" corretamente.

  2. Configuração de segurança: Se o Swagger ainda está sendo bloqueado, revise a ordem dos filtros e a configuração de segurança. Certifique-se de que o SecurityFilter está corretamente registrado e que o Swagger está listado como uma exceção nas regras de segurança.

  3. URL do Swagger: Confirme se as URLs que você está usando para o Swagger são as corretas para a versão do Spring Boot e Swagger que você está utilizando.

Espero ter ajudado e bons estudos!

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