Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

162
Vistas
Cómo comunicar la ID de usuario entre las aplicaciones de microservicio Spring Boot

Tengo tres servicios:

  1. Auth (provisión de token OAuth2 y nombre de usuario + contraseñas, nada más)
  2. Recursos relacionados con el usuario (dispositivos vinculados, fecha de nacimiento, etc.)
  3. datos de dominio

Los tres son aplicaciones Spring Boot. La autenticación se realiza a través de la provisión de tokens OAuth2, utilizando el almacén de tokens JDBC. Iniciar sesión, obtener el token funciona bien, solicitar datos de cualquiera de los otros dos servidores de recursos también funciona bien. Sin embargo, no estoy contento con la forma en que lo estoy haciendo, ya que parece un poco torpe:

Todos los datos en los servidores de recursos están vinculados al usuario a través de una ID de usuario generada en el lado del servidor. Creo que vincularlo al nombre de usuario es una mala idea si el usuario alguna vez quiere cambiar su nombre de usuario. En este momento, la forma en que obtengo la ID de usuario es resumida:

 @RequestMapping(method = RequestMethod.GET) public ResponseEntity<SampleData> getData(OAuth2Authentication authentication) { Authentication auth = authentication.getUserAuthentication(); final Map<String, Object> map = (Map) auth.getDetails(); // parse user data from the map ... }

El método getDetails devuelve el objeto de usuario completo en el servidor de autenticación como un mapa, porque esa es la forma en que lo vinculé en el archivo application.properties :

 security.oauth2.resource.userInfoUri=http://localhost:9000/api-auth/user

Pero no puedo decidirme a estar de acuerdo con esta solución, porque:

  1. Todos los métodos orientados al usuario tendrían que comenzar con este análisis e incluso después de convertirlo en una clase separada, siguen siendo las mismas dos líneas para cada método.
  2. Siento que los métodos ni siquiera deberían tener la OAuth2Authentication authentication como entrada; debería estar en una capa superior y no aquí (aunque podría ser mi sensación equivocada).

Mi pregunta es: ¿puedo hacerlo de manera más eficiente? ¿De una forma más limpia y sostenible?

Me gustaría tener:

 @RequestMapping(method = RequestMethod.GET) public ResponseEntity<SampleData> getData(String userId) { // interact with data with the userId }

Y definitivamente no depende de que el cliente envíe estos datos; esto tiene que provenir del servidor de autenticación.

Mis pensamientos (hasta ahora fallidos):

  1. Uso de token JWT: falló por el hecho de que estoy usando JDBC Token Store y parece que no es compatible con JWT. Además, los tokens JWT no se pueden revocar, ya que no están almacenados y deben tratarse mediante tokens de acceso/actualización de corta duración. Pero si nada más funciona, estoy abierto a este enfoque.
  2. Filtros: mi favorito, pensé que sería este, pero no pude hacerlo funcionar: recibo la solicitud en un, por ejemplo OncePerRequestFilter y analizo los datos. Pero luego no pude distribuir el objeto analizado directamente en el controlador. Esto parecía ser la solución, pero supongo que no está destinado a esto, tal vez.

¿Me estoy acercando a esto completamente mal o me estoy perdiendo algún detalle de Spring Boot que resuelve esto automáticamente?

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Usaría la opción 2 con OncePerRequestFilter . Puede analizarlo una vez y almacenar los resultados en ThreadLocal o InheritableThreadLocal si crea nuevos subprocesos.

Luego, se puede acceder a los datos locales del subproceso desde sus controladores o incluso más profundamente desde la capa de servicio.

Tema local :

Cada subproceso contiene una referencia implícita a su copia de una variable local de subproceso siempre que el subproceso esté activo y se pueda acceder a la instancia de ThreadLocal; después de que un subproceso desaparece, todas sus copias de instancias locales de subprocesos están sujetas a recolección de elementos no utilizados (a menos que existan otras referencias a estas copias).

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda