Иногда доступ к конкретным объектам в системе должен быть ограничен или предоставлен определенным пользователям или группам.
Каков наилучший способ реализовать это в микросервисах?
№1
Должен ли контроль доступа, управление разрешениями и т.д. быть ответственностью самого микросервиса? Разработчикам придется внедрять проверки прав доступа, хранить и обновлять разрешения для каждого сервиса. Похоже, это не очень надежный и подверженный ошибкам подход.
№2
Создать специализированный микросервис для управления правами доступа ко всем объектам? Этот сервис будет вызываться другими микросервисами для проверки прав доступа для каждого объекта и фильтрации объектов перед возвратом результатов. Централизованное хранение и управление разрешениями является преимуществом, но микросервис должен будет вызвать «Permission Service» для каждого объекта, чтобы проверить права доступа, что может отрицательно повлиять на производительность. И разработчикам по-прежнему придется интегрировать проверки доступа в свои сервисы, что оставляет пространство для ошибки.
№3
Обеспечить контроль доступа на уровне API Gateway или Service Mesh. Можно придумать реализацию, которая будет автоматически фильтровать ответы всех служб. Но в случае, когда микросервис возвращает список, проверка прав доступа должен быть проведена для каждого объекта. По-прежнему потенциальная проблема с производительностью.
Пример
Рассмотрим следующий исксственный пример. Система здравоохранения, работающая с результатами анализов, рентгеновскими снимками и т.д.
Результаты испытаний должны быть доступны только для:
Лечащий врач может отправить пациента к другому специалисту. Новый врач также должен иметь доступ к результатам анализов. Таким образом, доступ может предоставляться динамически.
Каждый объект (например, результаты анализов, рентгеновское изображение) имеет набор правил, каким пользователям и группам разрешен доступ к нему.
Представьте себе, что существует микросервис «TestResultsService», обрабатывающий результаты анализов. Должен ли он отвечать за контроль доступа, управлять разрешениями и т.д.? Или управление правами доступа должно быть выделено в отдельный микросервис?
Система здравоохранения может также обрабатывать визиты к врачу. Информация о визите пациента к врачу должна быть доступна:
- пациенту
- врачу
- ресепшионисту
Это пример другого типа сущности, который требует ограничения доступа на уровне сущности для отдельного пользователя или группы.
Легко представить еще больше примеров, когда требуется управление доступом на уровне сущности.