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

Problemas com o filtro.

Estou com o problema com o filter da função SecurityFilterChain, já usei o recomendado para o 3.2 do sptingboot, mas, não consigo acessar as rotas, ao fazer escrevei a saída "no filtro", porém, essa saída só sai na rota de login, nas demais eu não vejo nenhuma resposta.

Estou usando o postman, já tentei o bearer token direto, pelo authorizarion e nada.

Segue o código:

public class SecutirityFilter extends OncePerRequestFilter {

    @Autowired
    private TokenService tokenService;
    @Autowired
    private UsuarioReposotory repository;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("Entrei no filtro");
        var tokenJWT = recuperarToken(request);

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

            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 ", "");
        }
            return null;
    }

}

Ao fazer login eu realmente obtenho um token, mas, entrando no filtro, como proceder ?

5 respostas

Oi!

O código da classe Filter está correto. Apenas um detalhe: faltou anotar a classe com @Component

Mande aqui o código da classe de configurações de segurança

Eu cortei a parte do component, mas o marquei sim, seguea parte que falta com imports:

package med.voll.api.infra.security;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import med.voll.api.domain.usuario.UsuarioReposotory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;
//Componente genérico
@Component
public class SecutirityFilter extends OncePerRequestFilter {

Código da classe de segurança:

@Configuration
@EnableWebSecurity
public class SecurityConfigurations {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return
                http.csrf(csrf -> csrf.disable())
                        .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                        .authorizeHttpRequests(req -> {
                            req.requestMatchers("/login").permitAll();
                            req.anyRequest().authenticated();
                        })
                        .build();
    }



    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
        return configuration.getAuthenticationManager();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}
solução!

Na classe SecurityConfigurations está faltando adicionar o filtro nas configurações:

@Configuration
@EnableWebSecurity
public class SecurityConfigurations {
    
    @Autowired
    private SecurityFilter securityFilter;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return
                http.csrf(csrf -> csrf.disable())
                        .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                        .authorizeHttpRequests(req -> {
                            req.requestMatchers("/login").permitAll();
                            req.anyRequest().authenticated();
                        })
                        .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                        .build();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
        return configuration.getAuthenticationManager();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

Realmente era esse o problema, mais outro que que era um erro de digitação no Arquivo e classe.

Existem algum possibilidade de curso ou algo que aprofunde no spring security, tipo um projeto criando perfis de user, admin, editor etc ?

De resto parabéns pelo conteúdo.

Por enquanto não temos previsão para mais conteudos com foco no Spring Security.

Bons estudos!