我正在用一个数据库构建一个SAAS。在这种情况下,Tenant
被称为site
。
我想实现具有全局登录名以及stackoverflow / softwareengineering / etc登录名的Stackexchange的功能。我不确定如何存储用户。一个用户可以有许多站点,而站点可以有许多用户。设计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?
感谢阅读。
答案 0 :(得分:1)
这个问题涉及面很广,因此我将对其进行介绍。
如果要建立站点网络,则每个站点最好都有自己的数据库。这将确保沙箱化,并确保在出于扩展或安全考虑的需要时能够轻松地将站点迁移到其自己的基础结构。
在处理用户身份验证时,听起来您会想要一个安全的用户存储来充当oauth2服务器,而每个站点都充当Oauth客户端。您将要在OAuth中使用授权代码流授予类型。
基本上,用户访问站点A。站点A看到他们没有通过站点的会话登录。它将重定向到显示登录名的OAuth服务器(以Google登录名为准)。由于站点A也传递了回调URL,因此一旦登录,OAuth服务器就会知道将用户重定向到何处以及有效的令牌信息。然后,站点A获取该令牌并将其交换为服务器端的访问令牌,因此现在您在站点A上具有身份验证数据。
如果要实施自己的OAuth握手,则应利用现有的服务器/客户端库。对于PHP,您可以查看League OAuth服务器库,如果使用Laravel,则可以使用Laravel Passport。还有其他用于其他框架的类似软件包。