Как в микросервисах ограничивать доступ на уровне сущностей?
AAA (Authorization, Authentication, Accounting, не имею в виду семейство протоколов, а саму идею) - это всегда отдельная тяжелая служба, потому что высокая связность и зависимость других служб не входят в парадигму микросервисов.
Лучше всего себя показывает такой подход (AWS IAM, фейсбучная проверка доступа, тысячи их): отдельный сервис для работы с ACL, непосредственно контроль доступа - на стороне микросервисов.
Формат ACL можете честно стырить у IAM: на каждый тип объектов - базовые active,owner,read,edit и присущие этому типу, все ID объектов в одном формате и биективны, записи по каждому виду доступа в двух видах: Permission - ID (например для владельца) и Permission - ID List.
Непосредственно контроль доступа - на стороне микросервисов без выноса в отдельные сущности. Доступ проверяется по ID объекта, инициализирующего действие, по надобности ещё проверяются и его группы.
На вашем примере: PatientTHX1138, врач DoctorMengl создает карту о визите Case23523 и анализы Test991235-991237. У каждого анализа есть права на чтение/изменение всех его данных (для пациента/его лечащих врачей) или только даты приёма, кабинета и проводящего врача (для ресепшна). Дело передаётся отдельной функцией путем замены в ACL владельца, предыдущий врач в зависимости от причины передачи либо лишается доступа (увольнение/отстранение), либо получает доступ на чтение в обычном случае передачи, либо получает доступ на запись в случае передачи внутри группы врачей. Аналогичная ситуация с разным уровнем доступа для врачей и ресепшна у самого визита и пациента (ресепшну вряд ли надо знать, какого размера камень в почках).
1. Создайте общее "дерево" зависимостей сущностей (work-flow).
2. Создайте роли для разных объектов (пользователей/групп/сервисов и т.д.).
3. Создайте битовые ACL-"маски" для конкретных объектов и привяжите их к нужным узлам "дерева".
4. Если нужно управлять доступами динамически: создайте доп."маски" доступов (service override ACL) и меняйте их конкретным сервисом.