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.

Anulando la clase definida en Spring Boot \ Spring Security.

Estamos en el proceso de migrar una aplicación heredada a Spring Boot. Con el fin de continuar con las pruebas hasta que hayamos asignado roles a los usuarios, me gustaría invalidar lo siguiente:

class: SecurityContextHolderAwareRequestWrapper

método: public boolean isUserInRole(String role)

He creado una nueva clase que extiende SecurityContextHolderAwareRequestWrapper y invalida isUserInRole(), de la siguiente manera:

@Component
public class MySecurityContextHolderAwareRequestWrapper extends org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper {

public MySecurityContextHolderAwareRequestWrapper(HttpServletRequest request,
AuthenticationTrustResolver trustResolver, String rolePrefix) {
super(request, trustResolver, rolePrefix);
}

@Override
public boolean isUserInRole(String role) {
return true;
}
}

Cuando se ejecuta la aplicación, el nuevo bean no sustituye a la clase existente SecurityContextHolderAwareRequestWrapper. Esto es porque cuando se instancia la nueva clase, el constructor no recibe la inyección de beans que se están inyectando en SecurityContextHolderAwareRequestWrapper. La aplicación no puede iniciarse porque no se pueden encontrar parámetros de tipo AuthenticationTrustResolver y String para la nueva clase MySecurityContextHolderAwareRequestWrapper.

¿Cuál es la forma correcta de invalidar SecurityContextHolderAwareRequestWrapper, o cualquier clase en la estructura de Spring Boot?

Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para anular correctamente una clase en el marco de trabajo Spring Boot, debes asegurarte de que tu nueva clase esté correctamente configurada para reemplazar la clase original en el contexto de la aplicación. Esto implica registrar tu nuevo bean con el contexto de la aplicación y asegurarte de que tenga acceso a cualquier dependencia necesaria en la que se basara la clase original.

    En este caso específico, parece que la clase MySecurityContextHolderAwareRequestWrapper no se está registrando correctamente en el contexto de la aplicación y, como resultado, no está reemplazando la clase SecurityContextHolderAwareRequestWrapper original. Para solucionar esto, puedes anotar tu nueva clase con la anotación @Bean para garantizar que se registre en el contexto de la aplicación como un bean de primavera, como se muestra a continuación:

    @Component
    public class MySecurityContextHolderAwareRequestWrapper extends org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper {
    
        public MySecurityContextHolderAwareRequestWrapper(HttpServletRequest request,
                AuthenticationTrustResolver trustResolver, String rolePrefix) {
            super(request, trustResolver, rolePrefix);
        }
    
        @Override
        public boolean isUserInRole(String role) {
            return true;
        }
    
        @Bean
        public MySecurityContextHolderAwareRequestWrapper mySecurityContextHolderAwareRequestWrapper(HttpServletRequest request,
                AuthenticationTrustResolver trustResolver, String rolePrefix) {
            return new MySecurityContextHolderAwareRequestWrapper(request, trustResolver, rolePrefix);
        }
    
    }
    

    Al agregar la anotación @Bean a un método en tu clase que devuelve una instancia de tu nueva clase, Spring registrará automáticamente tu clase como un bean en el contexto de la aplicación.

    Una vez que tu nuevo bean esté correctamente registrado, debería reemplazar el bean SecurityContextHolderAwareRequestWrapper original en el contexto de la aplicación, y se debería usar tu nueva implementación del método isUserInRole() en su lugar.

    Ten en cuenta que si tu nueva clase se basa en alguna dependencia en la que se basa la clase original, deberás asegurarte de que esas dependencias estén disponibles para tu nueva clase, ya sea a través de la inyección de constructor o de alguna otra forma.

Comments are closed.