Symfony每个客户端登录多个数据库

时间:2015-08-20 11:26:40

标签: php symfony database-design doctrine-orm multi-tenant

我在Symfony2中开发了一个Web应用程序。该网站应该为每个客户端提供一个数据库。我的想法是创建一个主数据库,其中包含有关所有组织及其数据库的信息。但现在我遇到了一些麻烦。

每个客户都有自己的用户。此信息应存储在自己的数据库中。所以在我看来,每个客户都应该拥有自己的登录页面。现在我开始添加前缀以查看您的客户端:example.com/{client}/ - >控制器..事情是你不允许在你的路线中为symfony中的登录页面设置一个参数!那么我应该如何确保每个客户都有不同的登录页面?

另一件事是安全。确保用户无法将路由参数更改为其他客户端并获取访问权限的最佳方法是什么?

我一直在寻找互联网上的指南来做我需要做的事情。但我无法找到Symfony2的任何可靠方法..大多数是它的一半解决方案,例如只是通过服务在数据库之间切换。如果有另一个PHP框架可以做得更好,我肯定会考虑更改为。

我希望你们能给我一些建议。提前谢谢。

2 个答案:

答案 0 :(得分:0)

你所拥有的是一个多实例数据库结构,其中每个客户端都有自己独立的数据库,如何使用多租户数据库结构,其中所有客户端都存储在一个单独的数据库中,网站设置基于客户端ID,这样无需单独的登录页面或数据库切换。如果这不是项目结构中的巨大而重大的变化,您可以考虑它。也会更便宜

如果无法更改项目结构,那么如何使用子域而不是url slugs company.example.com代替example.com/company

答案 1 :(得分:0)

正如我所看到的,你有

的2个选项
  

结帐多实例数据库架构

(像the "cloud" option我假设?)

1:为部署用于管理该数据库的不同应用程序的每个客户端使用子域,而在主应用程序中,生成目录结构,部署symfony应用程序并管理vhost和dns区域生成。

2:为了解释这个问题,我们将使用它:

Clients =数据库的每个客户所有者。

用户=客户的客户。

每个客户使用相同的用户实体。

您提到您知道如何切换数据库,然后在数据库中存储您的客户端信息,包括数据库凭据(用户,通行证,数据库等等),并将用户信息存储在各自客户端的数据库中。 现在,当您调用example.com/{client}时,您在数据库中查找{client}加载该客户端的数据库信息,切换数据库并让用户登录并执行他/她的操作。显然,如果将数据库凭据存储在会话中,后续请求会更好。

现在你必须要问: 问:如果用户在登录后更改了{client}该怎么办? 答:symfony会注销用户。

或者至少那是documentation says

  

用户登录后,整个用户对象将被序列化   会议。在下一个请求中,反序列化User对象。   然后,id属性的值用于重新查询新鲜   来自数据库的用户对象。最后,新的User对象是   与反序列化的User对象相比,以确保它们   代表同一个用户。例如,如果用户名为2   对象由于某种原因不匹配,然后将记录用户   出于安全原因。

问:但是如果用户在另一个{client}上拥有相同的用户/传递怎么办? 答:请记住,id也是序列化的,但是如果你还想添加另一层安全性,只需在用户实体中添加一个字段,它引用它所属的客户端(在他们自己的数据库中)并序列化它。