La seguridad de Spring inyectando null @AuthenticatedPrincipal en los controladores.
Java 11, Spring Security aquí. Tengo el siguiente punto final/método en mi @RestController
:
@GetMapping("/centerPoint")
public void centerPoint(@AuthenticationPrincipal ExpiringUsernameAuthenticationToken token,
HttpServletResponse response) throws IOException {
<p>Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth == null) {
LOGGER.warn("La instancia de autenticación actual del contexto de seguridad está nula");
response.sendRedirect("alguna URL de redirección");
return;
}</p>
<p>SAMLCredential attributes = ((SAMLCredential) token.getCredentials());
// ...código restante omitido por brevedad</p>
<p>}
Cuando establezco un punto de interrupción dentro de este método e inicio sesión en mi aplicación, token
es null
(lo que significa que no se inyectó correctamente como un @AuthenticatedPrincipal
) sin embargo SecurityContextHolder.getContext().getAuthentication()
devuelve una instancia de Authentication
que parece estar completamente bien. Recibo un NPE cuando se llama a token.getCredentials()
en la parte inferior.
Sé que este es un fragmento de código incompleto y estoy dispuesto a proporcionar otras partes del código de seguridad (WebSecurityConfig
, etc.) sin embargo, me pregunto: ¿qué causaría que SecurityContextHolder.getContext().getAuthentication()
no tenga un token
para inyectar, pero sea no nulo?
davy.ai
Es posible que la anotación
@AuthenticatedPrincipal
no esté correctamente configurada o establecida enWebSecurityConfig
. Esto podría hacer que el parámetrotoken
no se inyecte correctamente con la información de autenticación del usuario.Otra posibilidad es que la información de autenticación no se haya pasado correctamente en las cabeceras o cookies de la solicitud, lo que provoca que el parámetro
token
sea nulo.También es importante asegurarse de que la clase
SAMLCredential
esté correctamente configurada y sea compatible con el método de autenticación utilizado.Sin más contexto sobre la configuración general de la aplicación y la configuración de seguridad, es difícil identificar la causa exacta del problema.