Autorización en microservicios: ¿cómo abordar el objeto de dominio o el control de acceso a nivel de entidad utilizando ACL?

Actualmente estoy construyendo un sistema basado en microservicios en Java Spring Cloud. Algunos microservicios usan PostgreSQL y algunos de ellos MongoDB. REST y JMS se utilizan para la comunicación. El plan es usar SSO y OAuth2 para la autenticación

El desafío al que me enfrento es que la autorización debe hacerse a nivel de objeto / entidad de dominio. Significa que se necesita algún tipo de ACL (Lista de control de acceso). La mejor práctica para este tipo de arquitectura es evitar algo como esto y tener una seguridad de grano grueso probablemente a nivel de la capa de aplicación / servicio en cada microservicio, pero desafortunadamente no es posible.

Mi idea final es usar Spring Security ACL y tener las tablas de ACL en la base de datos compartida entre todos los microservicios. La infraestructura de Spring solo accedería a la base de datos o mediante la API de Spring. El esquema de DB se ve estable y es poco probable que cambie. En este caso, simplemente rompería la regla sobre compartir db entre microservicios.

Estaba considerando diferentes tipos de soluciones distribuidas pero las dejé:

Un microservicio con ACL y acceder a él utilizando el reposo: el problema son demasiadas llamadas http y degradación del rendimiento. Tendría que extender Spring Security ACL para reemplazar el acceso db por llamadas de descansoACL en cada microservicio para sus propias entidades: suena bastante razonable, pero imagine un caso que tenga algunos modelos leídos de entidades sincronizadas con otros microservicios o la misma entidad que existe en diferentes contextos delimitados (microservicios diferentes). Las ACL pueden volverse realmente inmanejables y pueden ser fuente de errores.Un microservicio con tablas ACL que se sincronizan con otros microservicios como modelo de lectura. El problema es que no hay soporte en Spring Security ACL para MongoDB. He visto algunas soluciones personalizadas en github y sí, es factible. Pero ... al crear una nueva entidad, tengo que crear un registro en el microservicio que posee ACL y luego se sincroniza asincrónicamente como un modelo de lectura para el microservicio que posee la entidad. No parece una solución fácil.Elija un control de acceso basado en URL en la puerta de enlace API. Pero tendría que modificar Spring Security ACL de alguna manera. La puerta de enlace API debería saber demasiado sobre otros servicios. La granularidad del control de acceso está vinculada a la granularidad de la API REST. Quizás no puedo imaginar todas las consecuencias y otros problemas que traería este enfoqueFinalmente, la solución con db compartida que mencioné es mi favorita. En realidad, fue el primero que descalifiqué porque es una base de datos "compartida". Pero después de pasar por las posibilidades, me pareció que este es el único que funcionaría. Hay algo más de complejidad adicional en caso de que me gustaría utilizar algún tipo de almacenamiento en caché porque se necesitaría caché distribuida.

Realmente usaría algunos consejos y opiniones sobre cómo abordar la arquitectura porque esto es realmente complicado y muchas cosas pueden salir mal aquí.

Muchas gracias,

Lukas

Respuestas a la pregunta(1)

Su respuesta a la pregunta