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.

Forma prevista para agregar un nuevo filtro de cadena de seguridad de Spring en el contexto de una biblioteca de Spring Boot.

Estoy desarrollando una biblioteca que introduce un nuevo filtro de autenticación, que debe ser utilizado en la cadena de seguridad de Spring.

Sé que puedo agregar el filtro a través de algo como:

@EnableResourceServer
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
class AmazingSecurityConfiguration extends WebSecurityConfigurerAdapter {

// filtro de bean
@Autowired
private MyFilter myFilter;

@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// … un montón de requisitos por ruta
// … o ignorar la ruta “/bla”
// etc.
.anyRequest().authenticated();

http.addFilterBefore(myFilter.getFilter(),
AbstractPreAuthenticatedProcessingFilter.class);
}

}

Sin embargo, esto no funcionaría junto con una configuración definida por el usuario. Realmente, quiero configurar este bean dentro de la clase AutoConfigure de mi biblioteca, que se activa por las fábricas de spring.

Buscando en línea, veo ejemplos donde extienden la clase WebSecurityConfigurerAdapter ellos mismos, y tienen al usuario extender esta nueva configuración. Pero no sé si esto bloquea al usuario para hacer otra cosa, y también depende de que el usuario primero llame a super.configure (http) para que se cargue el filtro.

¿Cuál es la forma correcta aquí?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para introducir un nuevo filtro de autenticación en la cadena de spring-security, se recomienda crear una clase de configuración separada para el filtro, y luego incluirla en la aplicación principal de Spring Boot usando la anotación @Import.

    Aquí hay un ejemplo de cómo crear y configurar el filtro en una clase de configuración separada:

    @Configuration
    public class MyFilterConfiguration {
    
        @Bean
        public MyFilter myFilter() {
            return new MyFilter();
        }
    
        @Bean
        public FilterRegistrationBean<myfilter> myFilterRegistration(MyFilter myFilter) {
            FilterRegistrationBean<myfilter> registration = new FilterRegistrationBean<>();
            registration.setFilter(myFilter);
            registration.addUrlPatterns("/myfilter/*"); // Especifique los patrones de URL para activar el filtro
            return registration;
        }
    }
    

    En este ejemplo, MyFilter es el nombre del filtro de autenticación personalizado que desea agregar a la cadena de spring-security. En la clase de configuración, definimos un bean para MyFilter, y luego creamos un bean FilterRegistrationBean<myfilter> para registrar el filtro con el contenedor de servlet. También especificamos los patrones de URL que deben activar el filtro.

    Luego, debemos importar esta clase de configuración en la aplicación principal de Spring Boot. Podemos hacer esto usando la anotación @Import:

    @SpringBootApplication
    @Import(MyFilterConfiguration.class)
    public class MyApplication {
        // ...
    }
    

    Al importar la clase MyFilterConfiguration, el filtro de autenticación personalizado se agregará a la cadena de spring-security, junto con cualquier otra configuración que haya definido el usuario.

    Este enfoque permite a los usuarios definir su propia configuración de seguridad, mientras permite que su biblioteca introduzca un filtro de autenticación personalizado. Además, la clase WebSecurityConfigurerAdapter y sus métodos no necesitan ser extendidos ni anulados en este enfoque.

Comments are closed.