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.
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 claseSecurityContextHolderAwareRequestWrapper
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: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étodoisUserInRole()
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.