Авторизация в микросервисах - список строк, к которым пользователь может получить доступ - PullRequest
0 голосов
/ 24 сентября 2019

Мы разделяем наш монолитный раствор на микросервисы.Одним из микросервисов будет авторизация, которая отвечает за определение того, может ли пользователь получить доступ к определенным объектам.

В нашей системе мы разрешаем определять доступ к проектам для определенных пользователей в соответствии с различными критериями:

  • пользователь является менеджером проекта,
  • пользователь напрямую назначен проекту,
  • пользователь назначен проекту через присутствие в команде,
  • и т. Д.

Существуют правила, определяющие, может ли пользователь видеть или не видеть проект.

Микросервис авторизации будет отвечать за определение того, может ли пользователь получить доступ к проекту.Для поиска проектов (по имени) и отображения доступных проектов также должна быть возможность вернуть список всех доступных проектов для пользователя.

Проблема в том, что этот список может быть огромным (даже тысячи проектов).похоже проблема).Поэтому мы не можем позволить себе создавать запросы в других микросервисах, подобных этому:

SELECT * FROM project WHERE id IN ({list-of-accessible-projects-from-microservice})

Поскольку такой запрос не может быть принят СУБД из-за его длины.Также я беспокоюсь о производительности (большой список в предложении IN может замедлить его).Я сравню это, но мне любопытны другие подходы, как я могу сделать это, используя автономный микросервис авторизации.Или используя другой подход (например, виртуальная таблица для каждого пользователя со списком идентификаторов проектов, к которым я могу присоединиться для запроса).

1 Ответ

0 голосов
/ 24 сентября 2019

Если я правильно понимаю ваш вопрос, проблема заключается в том, что количество проектов, к которым у Пользователя может быть доступ, не ограничено - оно может (и, вероятно, будет) расти вечно.Если это правильно, ваши опасения по поводу производительности абсолютно верны.

Похоже, это отличная возможность для службы авторизации опубликовать событие интеграции UserProjectAccessChanged с подробной информацией о UserID (s), TeamID(s), и ProjectID (s) затронут.Ваша служба ManageProjects должна подписаться на это событие и хранить локальную постоянную копию пользователей и их уровень доступа для каждого проекта.Локальная таблица (таблицы) может быть построена таким образом, что запросы будут не только быстрыми, но вам потребуется всего лишь один сервис, чтобы получить ваши ответы (либо список проектов по пользователям, либо пользователей по проектам).

Различные микросервисы, хранящие свою собственную копию связанных данных, могут быть очень мощным инструментом и задуманы именно для решения таких проблем. Эта статья содержит некоторые полезные идеи, которые могут быть полезны для вас.

...