Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
6
respuestas

Consulta sobre el tema: Cambios en la versión 3.1 de Spring Boot

Hola, En relación al tema: 08 Cambios en la versión 3.1 de Spring Boot, estoy implementando el código que nos recomendaste:

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

Sin embargo, al utilizarlo, no reconoce el objeto securityFilter. ¿Podría tratarse de algo que estoy omitiendo o que necesite configurar previamente?

Gracias de antemano por tu ayuda.

Saludos,

David Rivera

6 respuestas
solución!

¡Hola David Rivera!

Entiendo que estás teniendo un problema al implementar el código que se recomendó en la lección "Cambios en la versión 3.1 de Spring Boot". Parece que el objeto securityFilter no está siendo reconocido al utilizarlo en tu configuración.

Una posible causa de este problema es que el objeto securityFilter no esté siendo instanciado o inyectado correctamente en tu aplicación. Asegúrate de que el bean securityFilter esté definido en tu configuración o que esté disponible para ser inyectado en la clase donde estás utilizando el método addFilterBefore.

Por ejemplo, si securityFilter es una clase que implementa javax.servlet.Filter, asegúrate de que esté correctamente configurada como un bean en tu aplicación, ya sea mediante anotaciones (@Component, @Bean) o mediante XML si estás utilizando configuración basada en XML.

Además, verifica que la clase donde estás utilizando el método addFilterBefore tenga acceso al objeto securityFilter. Si estás utilizando inyección de dependencias, asegúrate de que el objeto esté siendo inyectado correctamente.

Espero que estas sugerencias te ayuden a resolver el problema. Si necesitas más ayuda, no dudes en preguntar.

¡Espero haber ayudado y buenos estudios!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios!

Yo opté por quitar la línea:

                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)

No sé si hice bien y si se puede llegar a relacionar con el error persistente "Enconded password does not look like BCrypt" que me impide continuar.

En esta actividad, implementé un bean para la configuración de la cadena de seguridad en Spring Security mediante el método securityFilterChain. Esto incluyó deshabilitar CSRF y configurar la gestión de sesiones para ser stateless. El código quedó de la siguiente manera:

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.csrf(csrf -> csrf.disable())
                .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .build();
    }

En las actividades posteriores, el instructor amplió la configuración para gestionar las autorizaciones de las solicitudes. Se añadieron líneas que permiten el acceso al endpoint /login para solicitudes POST, mientras que cualquier otra solicitud requiere autenticación. Además, se agregó un filtro personalizado antes del filtro predeterminado de autenticación de usuario y contraseña. El código correspondiente fue el siguiente:

                .authorizeHttpRequests(req -> {
                    req.requestMatchers(HttpMethod.POST, "/login").permitAll();
                    req.anyRequest().authenticated();
                })
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)

Espero te ayude.

Sí, ese el código que tenía antes al que le quité la línea de "securityFilter" porque me daba error y no sé cómo ni donde debo inyectarla. Tampoco sé si éso tiene algo que ver con el error "Enconded password does not look like BCrypt" (no lo creo). Mi función quedaría así:

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

Y no compila. Si quito la línea:

                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)

Anda todo bien, excepto por el error que dije anteriormente.

Actualización. Agregué el siguiente método en SecurityConfiguration, con ayuda de la misma IDE y otro poco de ChatGPT:

    @Bean
    public Filter securityFilter() {
        return new Filter() {
            @Override
            public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                                 FilterChain filterChain) throws IOException, ServletException {

            }
        };
    }
    

Ahora ya no hay errores de compilación ni de ejecución. Puedo loguearme en Insonmia. Pero ahora ocurre algo muy raro. Por ejemplo, hago el request de obtener el listado de médicos activos y me responde con un 200 ok, pero no me muestra el listado.

Prueba con el siguiente código:

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
        return httpSecurity.csrf(c -> c.disable())
                .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) //! Le indicacmos a spring el tipo de sesion
                .build();
    }

Este código asegura la integración con Spring Security. El código que estás usando define un filtro manual y no está integrado con Spring.