Autenticación múltiple en Spring boot: JWT y formulario

Escenario

Por exigencias de un tercero debemos adaptar nuestro servicio web para que sea compatible con autenticación por JWT. Hasta ahora las llamadas al API se hacían desde dentro de la aplicación usando las mismas credenciales del usuario autenticado por cookie. La configuración de la cadena de filtros de Spring Security es la siguiente: En teoría bastaba con crear un nueva clase con otro Bean que configurara la cadena de filtros para JWT: Y encabezar las clases con la anotación @Order. A la primera clase —la que incluye la cadena de filtro para login con usuario y contraseña— le asignamos un orden posterior a la segunda clase, por ejemplo @Order(101) y <code>@Order(100). De este modo antes de aplicar el filtro de JWT se comprueba si la cabecera viene con la clave «Authorization», de ser así se aplica el filtro, de lo contrario se aplica el segundo filtro en el que verifica si el usuario está identificado y consta de alguno de los roles especificados.

Problema

«En mi máquina funciona». Clásica excusa… Hasta que lo desplegué en un servidor remoto. Entonces, de manera sistemática, la petición con el token era redirigida a /user/login. Después de un buen rato dando palos de ciego me decido a activar trazas en el jar desplegado en el servidor, añadiendo la siguiente clave en application.properties: logging.level.org.springframework.security.web.FilterChainProxy=DEBUG. Al hacer la petición se registra la siguiente configuración: En cambio, en mi aplicación local, arrancada por Netbeans: Claramente se están aplicando filtros distintos. Parece que en mi máquina se respeta el orden anotado en las clases de configuración, no así en el servidor.

Solución

Gracias a una issue en GitHub, caigo en la cuenta de que, a pesar de lo que haya podido leer en StackOverflow o en algún otro blog, el orden no ha de ser especificado a nivel de la clase, sino del Bean. y

Publicaciones Similares

  • Cómo modificar las cabeceras de una petición con nginx

    Escenario Hay que migrar una servicio API a una nueva plataforma. Esto implica rehacer el código desde cero y al mismo tiempo respetar todos los endpoints y aceptar las peticiones de los clientes del API tal y como se estaban mandando hasta ahora. Problema Las peticiones del cliente vienen mal formadas: se estaban mandado usando…

  • Valor por defecto en un combo de una plantilla de Thymeleaf

    Escenario En Thymleaf podemos usar el atributo th:field para enlazar la vista con el modelo:

    En caso de que hubiéramos cargado estos datos del servidor, nuestro select tendría esta pinta:

    Problema ¿Qué pasa si queremos seleccionar una divisa por defecto? En el caso de que fuera el euro tendríamos que hacer algo así,…

  • TemplateInputException

    Escenario Lo habré hecho centenares de veces. Desarrollo en local, pruebas y despliegue en remoto. Según el entorno en el que esté corriendo la aplicación, ésta podrá requerir una configuración distinta. Por ejemplo en un entorno de desarrollo querremos tener el caché deshabilitado o el nivel de los registros más bajo que en uno de…

  • |

    Sobrepasando el límite

    Por lo que he podido probar, de momento los modelos generativos locales están lejos de acercarse al rendimiento de los modelos de OpenAI, GPT-3 y GPT-4. Por otro lado el API de OpenAI impone un límite al tamaño de nuestras preguntas que, dependiendo del modelo que empleemos, será menor o mayor. Con GPT-3.5 no puedes…

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *