Создание Multi Tenancy / Saas и проблемы с настройкой базы данных для пользователей - PullRequest
0 голосов
/ 15 мая 2019

Я создаю SAAS с единой базой данных. Tenant в этом случае называется site.

enter image description here

Я хочу добиться того, что Stackexchange делает, когда у него глобальный логин, а также логин stackoverflow / softwareengineering / etc. Я не уверен, как хранить пользователей. Пользователь может иметь много сайтов, а сайты могут иметь много пользователей. Проблема с разработкой JoinTable заключается в том, что роли пользователей хранятся в таблице User (я использую Symfony3.4). Я хочу отдельные роли для сайта / арендатора.

Другая проблема, которую я пытаюсь выяснить, заключается в том, как войти в систему. Я использую oAuth2, и для входа в систему я просто звоню {{url}}/oauth/v2/token?grant_type=password&client_id=client_id&client_secret=client_secret&username=admin&password=pass. Как сделать так, чтобы пользователь входил на определенного арендатора / сайт? Добавлять ли site_id к параметрам запроса?

Спасибо за чтение.

1 Ответ

1 голос
/ 15 мая 2019

Этот вопрос очень широкий, поэтому я попытаюсь ответить на него.

Если вы создаете сеть сайтов, каждый сайт в идеале будет иметь свою собственную базу данных. Это обеспечит «песочницу» и возможность при необходимости легко перенести сайт в собственную инфраструктуру из-за проблем с масштабированием или безопасностью.

При работе с аутентификацией пользователей создается впечатление, что вам нужно одно безопасное хранилище пользователей, которое действует как сервер oauth2, а каждый из сайтов действует как клиент Oauth. Вы захотите использовать тип предоставления кода авторизации в OAuth.

По сути, пользователь посещает сайт A. Сайт A видит, что он не вошел в систему через сеанс сайта. Он перенаправляет на ваш сервер OAuth, который показывает логин (представьте логин Google). Поскольку сайт A также передавал URL-адрес обратного вызова, после того как вы вошли в систему, сервер OAuth знает, куда перенаправить пользователя, вместе с действительной информацией о токене. Затем сайт A берет этот токен и обменивает его на токен доступа на стороне сервера, так что теперь у вас есть данные аутентификации на сайте A.

Если вы собираетесь реализовать свое собственное подтверждение связи OAuth, вам следует использовать существующую библиотеку сервер / клиент. Для PHP вы можете посмотреть библиотеку сервера League OAuth или использовать Laravel Passport, если вы используете Laravel. Существуют и другие подобные пакеты для других фреймворков.

...