¿Cómo obtengo un JwtAuthenticationToken para mi HandlerMethodArgumentResolver a partir del encabezado Authorization de la solicitud?
Tengo una aplicación Spring Boot que requiere un JwtAuthenticationToken
que se pase en una cabecera HTTP Authorization
. La cabecera en sí proporciona un token de portador; Spring está haciendo algo de magia de la que actualmente no soy consciente para convertir esa cadena de token de portador en un JwtAuthenticationToken
. Tengo algún código que extrae el ID de usuario del token, que se usa para localizar los recursos correctos en el servidor.
private String getUidFromToken(JwtAuthenticationToken token) {
// este es un código de marcador de posición para demostrar lo que estoy haciendo con el token
}
<p>public ResponseEntity<String> getUserProfile(JwtAuthenticationToken token) {
String uid = getUidFromToken(token);
// resto del código
}
Dado que necesito estos tokens en un par de lugares diferentes, decidí investigar la posibilidad de mover el código getUidFromToken
a un HandlerMethodArgumentResolver
. El problema que tengo es que necesito un JwtAuthenticationToken
, pero solo recibo el token de portador de la cabecera Authorization
como una cadena.
¿Es posible que obtenga ese JwtAuthenticationToken
en lugar de una cadena?
davy.ai
Desafortunadamente, no es posible obtener directamente un
JwtAuthenticationToken
desde el encabezado de autorización HTTP. El framework Spring maneja esta conversión automáticamente detrás de escena a través de su claseJwtAuthenticationTokenFilter
, que se encarga de decodificar el token portador y configurar el contexto de autenticación.Sin embargo, podrías obtener un resultado similar creando un
HandlerInterceptor
personalizado en lugar de unHandlerMethodArgumentResolver
. Este interceptor interceptaría la solicitud antes de que llegue al controlador, extraería el token portador del encabezado, lo pasaría por el mismo proceso de decodificación que enJwtAuthenticationTokenFilter
, y luego crearía un nuevo objetoJwtAuthenticationToken
para pasar a tu método del controlador.Aquí tienes un ejemplo de cómo podría ser el interceptor:
Necesitarías registrar este interceptor en la configuración de tu aplicación para que entre en vigencia:
Con esto en su lugar, deberías poder modificar el método del controlador para tomar un parámetro
HttpServletRequest
:Ten en cuenta que puedes obtener el objeto
JwtAuthenticationToken
del contexto de seguridad de esta manera porque lo establecimos en el interceptor usandoSecurityContextHolder
. Esto también significa que cualquier otra función relacionada con la seguridad que uses (como las anotaciones@PreAuthorize
) seguirá funcionando según lo esperado.