es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Acceso a Spring Security exclusivo para direcciones IP permitidas en la lista blanca.

Tengo una aplicación de Spring Boot y he añadido Spring Security. Me gustaría que algunas rangos de IP pasen la seguridad mientras que todas las solicitudes restantes necesiten iniciar sesión antes. He extendido la clase WebSecurityConfigurerAdapter como se muestra a continuación. Sin embargo, no funciona como esperaba. Las IP de la lista blanca pueden usar la aplicación sin iniciar sesión mientras que otras solicitudes reciben un HTTP 403 en lugar del formulario de inicio de sesión. ¿Qué estoy haciendo mal aquí?

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().access("hasIpAddress('192.168.1.0/24') or isAuthenticated()");
    }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede residir en el orden de las llamadas de authorizeRequests(). La configuración actual permite que cualquier solicitud que venga del rango de IP 192.168.1.0/24 omita la autenticación y autorización, pero otras solicitudes requieren autenticación. Sin embargo, para solicitudes que no provienen de ese rango de IP, no tiene ninguna otra regla de autorización, por lo que obtiene un error 403 en lugar de un formulario de inicio de sesión.

    Para solucionar esto, debe especificar la regla de autorización para usuarios autenticados antes de la regla de lista blanca IP. De esta manera, si un usuario no proviene del rango de IP permitido, se le solicitará que inicie sesión antes de poder acceder a cualquiera de los recursos protegidos. Aquí hay una configuración actualizada que debería funcionar:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .authorizeRequests().access("hasIpAddress('192.168.1.0/24')")
                .and()
                .formLogin().permitAll() // Personalice la URL de inicio de sesión, los campos del formulario, etc.
                .and()
                .logout().permitAll() // Personalice la URL de cierre de sesión, la redirección de éxito, etc.
                .and()
                .csrf().disable(); // Deshabilitar la protección CSRF para simplificar
        }
    }
    

    En esta configuración actualizada, primero permitimos el acceso no autenticado al punto final /login. Luego requerimos que todas las demás solicitudes estén autenticadas con la regla .anyRequest().authenticated(). Después de eso, especificamos por separado la regla de lista blanca de IP usando .access("hasIpAddress('192.168.1.0/24')"). Finalmente, agregamos alguna configuración adicional para el formulario de inicio de sesión y la protección CSRF (que está deshabilitada aquí para simplificar).

    Con esta configuración en su lugar, las solicitudes que provienen del rango de IP permitido deberían omitir la autenticación y autorización, mientras que todas las demás solicitudes deberán iniciar sesión antes de acceder a cualquier recurso protegido.

Comments are closed.