SaaS方法访问多个数据库和用户身份验证机制与master数据库


SaaS ways to access multiple databases and user authentication mechanisms with master database

我正在构建一个 saas 应用程序,其中包含用于所有事务和用户群的主数据库以及每个租户的单独数据库。每个租户都有一个唯一的子域,并基于该子域,正确的数据库指向租户。Web应用程序是使用php构建的,MySQL用于数据存储。

我有几个问题,首先;

  1. 当用户访问租户主页(例如 Sub.abc.com)时,将有一个可用的登录功能。由于用户名密码和用户群位于 master 数据库中,我将如何对用户进行身份验证?是通过主数据库的单独数据库连接还是通过 Web API?最好的方法是什么?

  2. 租户将创建角色。因此,假设通过调用 Web API 检索特定租户的员工,并且角色与用户 ID 一起存储在租户数据库中。这是正确的前进方向,因为没有直接的外键映射,而且一旦检索到用户,我应该存储在租户数据库中还是仅将其保存在内存中?

  3. 如果业务所有者想要有关每个租户数据库的特定内容的报告,那么从每个租户数据库中获取所有数据的最佳方法是什么?

  4. 我们如何捕获每个租户的数据库使用情况,文件存储并在超级管理员中显示?

如何对用户进行身份验证?是通过主数据库的单独数据库连接还是通过 Web API?最好的方法是什么?

小心"最佳方式"问题 - 这将指向这个问题偏离主题,因为基于意见。

如果您的应用程序是完全闭源的(我想是这样),那么没关系。如果需要,可以直接访问 master 数据库,因为所有客户端实现都将是整个软件包的一部分。

话虽如此,为了可伸缩性和可维护性,构建身份验证 API 接口并使用它可能是一个更好的主意,这样您就不需要管理客户端软件的数据库连接组件。

。该角色与用户 ID 一起存储在租户数据库中。这是正确的前进方向,因为没有直接的外键映射,而且一旦检索到用户,我应该存储在租户数据库中还是仅将其保存在内存中?

这很好。用户对于所有实现都是通用的,但角色对于每个客户端实现都是唯一的。这表明您处理它的方式是正确的,因为您首先进行身份验证,然后在登录后将客户端的角色分配给用户。您应该根据本地数据库(显然)检查这一点,然后将其分配给用户的会话,以便它在访问期间保持不变。

如果业务所有者想要有关每个租户数据库的特定内容的报告,那么从每个租户数据库中获取所有数据的最佳方法是什么?

这太宽泛了,无法回答。您在这里也应该小心,因为客户的数据可能不是您的报告!

我们如何捕获每个租户的数据库使用情况,文件存储并在超级管理员中显示?

同样,相当广泛,但我假设您可以通过查询MySQL服务器以获取每个客户端数据库的数据库统计信息来实现这样的事情,并通过查询托管客户端文件的服务器对文件存储执行相同的操作。


我希望这是有帮助的,如果您需要更具体的帮助,请进一步缩小您的问题范围。

小心"最佳方式"问题 - 这将指出这一点 以意见为基础的题外话的问题。

如果您的应用程序是完全闭源的(我想它是 是),那就没关系了。您可以访问主数据库 如果需要,可以直接使用,因为所有客户端实现 将成为您整个软件包的一部分。

话虽如此,对于可扩展性和可维护性,它可能是一个 构建身份验证 API 接口并使用它是一个更好的主意,所以 您无需管理您的 客户端软件。

同意。看到的事情是,对于这些场景,很难找到答案,尤其是在多租户方面。

闭源是什么意思?

如果我可以使用身份验证 API 从 master 数据库中检索数据,那么我将如何以仅在应用程序内授予访问权限而外部各方无法访问它的方式托管它?稍后,我们还需要向外部用户公开服务。在这种情况下,是从现在开始公开它还是稍后处理单独的服务更好?除了NuSOAP之外,您还知道哪些最整洁的PHP Web服务库?

这很好。用户对于所有实现都是通用的,但是 每个客户端实现的角色都是唯一的。这表明 您接近它的方式是正确的,因为您进行身份验证 首先,然后在登录后将客户端的角色分配给用户。你 应该根据您的本地数据库(显然)检查这一点,然后分配 它到用户的会话中,因此它会在他们的会话期间持续存在 访问。

没错!用户对于所有实现都是通用的,它存储在 master 数据库中,而不是单个租户数据库中。我的意思是,每个租户应用程序,租户可以创建租户应用程序中的角色,例如计费单位、帐户、前台等。因此,这些user_id和role_id存储在租户的数据库中。这就是为什么我问,因为如果可以的话,user_id不会直接映射到 master 数据库的用户表。

这太宽泛了,无法回答。你在这里也应该小心,因为 客户的数据可能不是您的报告!

现在,假设超级管理员想知道每个租户的角色。在这种情况下,如何从所有租户数据库中检索数据?我们是为此使用视图还是因为我们使用的是 mysql,我该如何实现这一点?

同样,相当广泛,但我认为您可以实现类似 这是通过查询MySQL服务器以获取每个数据库统计信息 客户端数据库,并通过查询 承载客户端文件的服务器。

对此非常抱歉。我们基本上希望跟踪租户数据库的使用情况,以查看它们是否超过我们商定的数量。这就是原因。我希望有一种方法可以实现这一目标。

此外,对于站点映像,作为 BLOB 存储在硬盘上还是存储在数据库中更好?归根结底,我们需要考虑可扩展性以及以更少的带宽消耗加载图像的方式?