多租户SaaS应用的最佳方法是什么?

3
我正在尝试构建一个多租户的SaaS应用程序,我知道有多种方法可以实现,但我选择了多数据库的方法,因为我认为它最适合。
因此,我为每个租户创建了一个数据库,并在主数据库中存储了一个租户表,根据子域名将用户连接到其各自的数据库。
现在我的问题是在哪里存储用户,是在主数据库中还是在租户数据库中。将用户存储在主数据库中将使得在其他数据库中获取与用户相关的模型更加困难,但将其存储在租户数据库中将使得在所有用户上进行身份验证变得困难...
另外,哪种情况最好呢?
1. 进行身份验证,获取JWT令牌。 2. 每个请求都发送令牌。 3. 在每个请求上验证令牌,检查子域名,连接到相应的租户数据库,执行请求。
这是一个好的方法吗?我该如何解决用户表的问题?谢谢!

将其存储在租户数据库中会使得在所有用户上进行身份验证变得困难。你为什么想要这样做呢? - Alex Howansky
也许我没有表达清楚...如果我将它存储在租户数据库中,当用户第一次登录且没有指定要使用哪个租户时,我如何知道从哪个数据库进行身份验证? - Sherif
1
要么让他们明确指定租户,使用类似电子邮件(例如user@domain.com)的用户ID,要么通过查看提供请求的域名来隐式确定租户。在任何情况下,您希望每个租户内的用户ID是唯一的,而不是跨所有租户唯一的。也就是说,如果有人在租户#1中设置了用户ID bob,则这不应阻止其他人在租户#2中使用用户ID bob。 - Alex Howansky
1
我知道你正在使用多个数据库,但如果你决定切换到单个数据库,我建议你看一下Landlord,它非常适合SaaS平台。这只是一个想法,祝你好运。 - camelCase
2个回答

0

一个好的选择是将用户保存在租户数据库中。由于您根据子域区分租户,因此可以告诉您的身份验证系统查询特定子域的数据库。

身份验证流程

  1. 用户点击子域以登录应用程序
  2. 用户凭据将被发送到应用程序
  3. 在将凭据传递给身份验证之前,根据用户来自的子域决定用户身份验证的数据库。
  4. 将数据库名称、用户凭据传递给身份验证系统
  5. 身份验证系统查询特定数据库并对用户进行身份验证
  6. 生成会话

0

我可以提供第三个选项。在租户数据库和主数据库中都有用户。然后,您可以创建过程,在租户数据库更改用户时更新主数据库(或反之亦然)。

此外,我不了解 Laravel 中的模型,但 MySQL 不会在跨数据库 JOIN 上出现问题。


我会研究MYSQL跨数据库连接,但我尽量避免重复数据,因为我认为这是不好的做法。 - Sherif
这要看情况。在多租户应用程序中,有时为了更好的性能,最好拥有多个数据。如果一个服务器不够用怎么办?你可以将租户数据库简单地分配到多个数据库服务器上,但仍需要将它们全部放在主数据库中。 - Tomáš Jacík

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接