Должен ли каждый микросервис управлять своими собственными разрешениями и ролями пользователей?

У меня проблема с дизайном, и я не знаю, как ее решить.

Допустим, мое основное приложение состоит из 6 модулей:

  • клиент
  • шлюз
  • служба авторизации
  • Форум
  • галерея
  • Сообщения

Предполагается, что клиент взаимодействует только с сервисом-шлюзом.

Должен ли мой шлюз выполнять аутентификацию пользователя (которая в идеале приводит к JWT), а остальные 3 продуктивных сервиса (форум, галерея, сообщения) просто проверяют этот токен и получают разрешения и роли они управляют собой для этого пользователя?

Чтобы, возможно, проиллюстрировать свои небольшие проблемы, я создаю диаграмму последовательности: Должен ли каждый микросервис управлять своими собственными разрешениями и ролями пользователей?

кликните сюда для оригинальной графики draw.io, если вам так больше нравится.

Я не хочу использовать сторонние сервисы авторизации; Я просто хочу, чтобы моя служба авторизации (что в значительной степени уже сделано) регистрировала пользователей и позволяла им входить в систему. Или мне также следует управлять разрешениями и ролями в этой службе?

Я пытался осмыслить эту проблему в течение нескольких месяцев, но я просто не могу найти подходящую структуру, чтобы позволить пользователю регистрироваться, входить / выходить из системы и общаться с различными продуктивными службами. В настоящее время я использую Java для бэкэнда, но микросервисы хороши тем, что мне не нужно использовать один язык программирования для всех.

Любая помощь здесь приветствуется!

PS: Я читал Стратегия микросервисной аутентификации и Zuul - Аутентификация шлюза API, но оба, похоже, не применимы в моем случае.

@sschrass, это не очень полезно ... как вы думаете, я бы опубликовал вопрос во всех его деталях и с включенной диаграммой, если бы я не подумал об этом по меньшей мере дважды?

Igor 07.08.2018 17:10

для ваших пользователей, вероятно, так и есть.

sschrass 07.08.2018 18:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
2
7 533
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это зависит от сложности настройки разрешений.

Если ваши разрешения очень простые, то есть все службы нуждаются в аутентификации и имеют одну роль для работы, вы можете добавить ее в api шлюза.

Если вам нужен более детальный подход, вам нужно сделать это на уровне модуля. Обычно в архитектуре микросервисов каждая служба будет вызывать другую службу, и наличие настроек авторизации на уровне модуля позволяет избежать предварительного знания необходимых разрешений, необходимых в API шлюза. И вы можете развернуть каждый из этих модулей, не задумываясь о других сервисах, иметь детальные разрешения на уровне методов и т. д.

Ответ принят как подходящий

Я работал со следующей установкой, и она сработала очень хорошо:

Процесс входа в систему:

  1. Свежий браузер делает запрос на конкретный ресурс
  2. Служба шлюза обнаруживает отсутствие файла cookie jwt и перенаправляет на форму входа
  3. Форма входа связывается с сервисом авторизации через шлюз. Шлюз разрешает не-jwt звонки только на сервис авторизации
  4. Служба аутентификации предоставляет форме входа в систему только что созданный файл cookie jwt и перенаправляет на исходный URL

Нормальная операция:

  1. Браузер запрашивает ресурс вместе с файлом cookie jwt
  2. Служба шлюза перехватывает запрос и перенаправляет jwt в службу аутентификации для проверки
  3. Служба аутентификации проверяет подпись, затем метку времени, затем черный список и возвращает положительный или отрицательный результат
  4. Если положительно, служба шлюза перенаправляет запрос в соответствующую внутреннюю службу, в противном случае перенаправляет на вход в систему.
  5. Серверная служба не выполняет проверку jwt - она ​​просто доверяет шлюзу отправлять только действительные запросы.
  6. Серверная служба проверяет наличие ролей / разрешений / прав, определенных в jwt

Процесс выхода:

  1. Браузер делает запрос к сервису авторизации / выходу из системы
  2. Служба аутентификации помещает jwt в черный список и перенаправляет на форму входа

Теперь это простой рабочий процесс, который мы реализовали без любой (много) сторонней помощи. В какой-то момент нам пришлось использовать файлы cookie сеанса, но это было по другим причинам. Обратите внимание, что система почти не имеет состояния, за исключением черного списка в службе аутентификации. Невозможно просто выйти из системы с помощью jwt! У нас был РЕДИС для управления черными списками. Вы можете реализовать выход с помощью сеансовых файлов cookie на шлюзе или в службе аутентификации.

Большинство серверных сервисов ожидали своего собственного набора ролей / привилегий / полномочий в jwt. Роли были предоставлены пользователю службой аутентификации и были записаны в предоставленном jwt. Если пользователю была предоставлена ​​новая роль, пользователь должен был выйти из системы / войти в систему, чтобы отразить эту привилегию. Если какая-то привилегия была удалена, то пользователь должен был принудительно выйти из системы - именно здесь играл REDIS.

Я подумал о чем-то вроде вашего ответа. Я полагаю, что под REDIS вы имеете в виду redis.io, поэтому я полагаю, что я попробую (я уже кое-что сделал, но не продолжил работу над этим, так как это частный проект).

Igor 11.08.2018 00:32

Другие вопросы по теме