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

  • Actualización de Mautic 4

    Este artículo va dedicado a aquellos administradores web entre cuyas labores se encuentre el mantenimiento de una instalación Mautic. Por eso no voy a explicar qué es Mautic: si no lo conoces, este artículo carece de interés. Vamos a partir de la base que el usuario UNIX, propietario de la instalación, es mautic y que…

  • Hibernate no puede resolver la propiedad…

    Escenario En una aplicación Spring Boot v2.3.4 hay dos entidades Balance y Shop. Una tienda (shop) puede tener varios saldos y un saldo (Balance) ha de estar relacionado con una tienda. Además existen panaderías (Bakery) y sastrerías (TailorShop) que extienden la clase Shop:

    Y necesito saber cuál es la fecha del…

  • OsTicket y nginx

    Escenario Después de 5 años campando en un Ubuntu 16.04 ha llegado la hora de migrar la aplicación osTicket a un nuevo servidor. Para quien no la conozca osTicket es un sistema de incidencias que podemos desplegar en un servidor propio. La aplicación web cuenta con una herramienta que automáticamente detecta una diferencia de versiones…

  • La tabla mysql.plugin no existe

    Escenario Después de necesitar restaurar tres veces el servidor de MySql por culpa de varios crashs provocados por un fallo en el disco duro, encuentro en los logs entradas de este tipo: 2020-09-12T18:46:22.347957Z 5 [Warning] InnoDB: Cannot open table mysql/help_relation from the internal data2020-09-12T18:46:22.348985Z 5 [Warning] InnoDB: Cannot open table mysql/innodb_index_stats from the internal data dictionary of InnoDBdictionary Problema En varios foros leo que la solución pasa por hacer un:

    La cuestión es que, cuando lo intento, me encuentro…

  • |

    Como (no) cambiar la batería de un Sennheiser mm100

    Aviso a navegantes: es la primera vez que manipulo un componente electrónico tan pequeño y delicado. Si comparto mi experiencia es por dejar documentado mi apaño, seguro que alguien más experimentado en estos menesteres lo haría de otra manera, o sea, bien. A mi favor tengo que decir que me ha valido y, bueno, me…

Deja una respuesta

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