Должен ли каждый микросервис управлять своими собственными правами и ролями пользователей?
У меня есть проблема с дизайном, которую я не знаю, как решить.
Предположим, что мое основное приложение состоит из 6 модулей:- клиент
- шлюз
- auth-service
- форум
- галерея
- сообщения
Клиент должен взаимодействовать только со службой шлюза.
Должен ли мой шлюз выполнять аутентификацию пользователя (что в идеале приводит к JWT) и другие 3 продуктивные службы (форум, галерея, сообщения) просто проверьте этот маркер и извлеките разрешения и роли , которыми они управляют сами для данного пользователя?
Чтобы, возможно, проиллюстрировать мои немногочисленные проблемы, я создаю диаграмму последовательности действий:
Нажмите здесь для оригинала draw.io графика, если вам так больше нравится.
Я не хочу использовать какие-либо сторонние auth-сервисы; я просто хочу, чтобы мой auth-сервис (что в значительной степени сделано) регистрировал пользователей и позволял им входить в систему. Или я должен управлять разрешениями и ролями в и эта служба тоже?
Я пытался обмозговать этот вопрос в течение нескольких месяцев, но я просто не могу найти подходящую структуру, чтобы позволить пользователю зарегистрироваться, войти/выйти из системы и общаться с различными производственными службами. В настоящее время я использую Java для бэкенда, но хорошая вещь о микросервисах заключается в том, что мне не нужно использовать один язык программирования для всех них.Любая помощь здесь приветствуется!
П. С.: Я прочитал стратегии проверки подлинности конструирование иаутентификация шлюза Zuul - Api , но оба они, похоже, не применимы в моем случае.
2 ответа:
Я работал со следующей установкой, и она сработала довольно хорошо:
Поток входа в систему:
- свежий браузер делает запрос на определенный ресурс
- служба шлюза обнаруживает отсутствие файла cookie jwt и перенаправляет его на форму входа
- форма входа ведет переговоры с auth-сервисом через шлюз. Шлюз позволяет не вышлю звонки только на авт-сервис
- служба Auth выдает логин-форму вновь созданного JWT cookie и перенаправляет на исходный URL
Нормальный операция:
- браузер делает запрос на ресурс вместе с JWT cookie
- служба шлюза перехватывает запрос и перенаправляет jwt в auth-service для проверки
- служба Auth проверяет подпись, затем отметку времени, затем черный список и возвращает положительный или отрицательный результат
- в случае положительного ответа служба шлюза пересылает запрос в соответствующую серверную службу, в противном случае перенаправляет запрос на вход
- серверная служба не выполняет проверку jwt - она просто доверяет шлюз для отправки только действительных запросов.
- серверная служба проверяет наличие ролей / разрешений/прав, определенных в jwt
Поток выхода из системы:
- браузер делает запрос на auth-сервис / выход из системы
- служба Auth помещает jwt в черный список и перенаправляет на форму входа
Теперь это простой рабочий процесс, который мы реализовали без
какой-либо(много) сторонней помощи. В какой-то момент нам пришлось использовать сеансовые куки, но это по другим причинам. Обратите внимание, что система практически не имеет состояния, за исключением черного списка в службе auth. нельзя просто выйти из системы с помощью jwt!У нас был редис для управления черными списками. Вы можете реализовать выход из системы с помощью сеансовых файлов cookie в gateway или auth service.Большинство серверных служб ожидали свой собственный набор ролей / привилегий/прав в jwt. Роли были предоставлены пользователю службой auth и записаны в предоставленном jwt. Если пользователю была назначена новая роль, он должен был выйти из системы/войти в систему. отразите эту привилегию. Если какая - то привилегия удалена, то пользователь должен был принудительно выйти из системы-вот где играл REDIS.
Это зависит от того, насколько сложна настройка разрешений.
Если ваши разрешения очень просты, то есть все службы нуждаются в аутентификации и имеют одну роль a для работы, вы можете добавить в gateway api.
Если вам нужен более детальный подход, вам нужно сделать это на уровне модуля. Как правило, в архитектуре микрослужбы каждая служба вызывает другую службу, и наличие параметров авторизации на уровне модуля позволяет избежать предварительного знания требуемых разрешений, необходимых на уровне модуля. API шлюза. И вы можете развернуть каждый из этих модулей, не задумываясь о других службах, иметь детализированные разрешения на уровне метода и т. д.