2016-08-30 70 views
3

我试图建立一个多租户SaaS应用程序,我知道有多种方法,但我选择了一个我认为最适合的多数据库。多租户SaaS应用程序的最佳方法

所以我为每个租户创建一个数据库,并在主分区 中存储租户表,并根据子域将用户连接到各自的数据库。

现在我的问题是在哪里存储用户,在主分贝?或租户数据库,存储在主分贝的用户将使其难以获得其他数据库的用户相关模型,但将其存储在租户数据库将使其难以对所有用户进行身份验证...

也最好的场景是什么?

  1. 进行身份验证,获取jwt令牌。
  2. 向每个请求发送令牌。
  3. 对每个请求验证令牌,检查子域,连接到各自的租户数据库,执行请求。

这是一个好方法吗?我应该如何处理用户表问题? ThnQ

+0

“保存它里面的租户数据库将难以对所有用户进行身份验证”为什么你想这样做吗? –

+0

也许我没有说清楚......如果我把它存储在租户数据库中,当用户第一次登录时没有指定哪个租户。我怎么知道从哪个数据库进行身份验证? – Sherif

+1

要么通过使用看起来像电子邮件的用户标识(例如,[email protected])明确指定租户,要么通过查看提供请求的域名来隐式确定租户。无论哪种情况,您都希望您的用户标识在每个承租人中都是唯一的,而不是在所有承租人中唯一。也就是说,如果有人在租户#1内设置了用户标识,那么这不应该阻止其他人在租户#2内使用用户标识。 –

回答

0

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

此外,我不知道Laravel中的模型,但MySQL在跨数据库JOIN中没有问题。

+0

我会看看MYSQL交叉db连接,但我尽量避免重复的数据,我认为这是不好的做法 – Sherif

+0

这取决于。在多租户应用程序中,有时最好有多个数据以获得更好的性能。如果一台服务器不够用呢?您可以简单地在多个数据库服务器之间拆分租户数据库,但您仍然需要在主数据库中使用它们。 –

0

良好的选择将保持用户在租户数据库。由于您根据子域来区分租户,因此可以让您的身份验证系统查询子域特定的数据库。认证的

共享流量

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