mysql - 跨多个项目/服务器使用用户数据库?
问题描述
我有一个项目和某种子项目。现在我希望子项目使用与主项目相同的用户数据进行登录。本质上,我有点想使用主项目的用户表(也可能是与用户相关的第二个表)。虽然这不是单向的,但我希望用户也能够在子项目上创建帐户,这对主项目也有效。
问题是:这些项目为他们的 SQL 数据库使用不同的专用服务器。(尽管 MariaDB 都在版本 10 或 10.1 中)
我考虑了以下选项:
1)我只能在子项目中打开 2 个 mysql 实例,一个用于访问子项目数据,一个用于访问主项目中的用户数据。不过,这有一个很大的缺点,a) 好吧,我打开了 2 个连接,这可能也会带来性能损失,b) 我根本不能在 users 表上使用任何 JOIN。
2) 我听说有一个 FEDERATED 引擎,当使用 FEDERATED 引擎的表参与某些查询时,它可以用来自动进行远程调用。但是,MariaDB 似乎不再支持此引擎。(我也没有来测试它以查看它可能带来的其他缺点。我在某处读到此方法存在潜在的安全问题,因为很容易读出与主服务器的连接信息?)
3)我从未使用过复制,但如果我正确理解了这个系统,我可以让第二个本地数据库基本上是主服务器的用户表的从属,对吧?但是,我担心这迟早会导致问题,特别是如果我考虑到将来可能会有更多的子项目使用主项目的用户表。当多个服务器尝试同时添加(或编辑)内容时,让许多服务器维护完全相同的数据听起来像是很多潜在的麻烦制造者。
4) 通过 OpenID 或 Oauth 的中央登录表单目前不是一个理想的选择。现在我希望每个项目都提供自己的注册/登录表格。
这些(或其他)方法中的哪一个是最优化的,并且对于这个用例来说最容易设置/维护?
解决方案
虽然我已经投票关闭这个基于意见的,但我仍然会提供我的意见:创建一个中间服务来进行身份验证,并且该中间服务担心细节。
中间服务与两个数据库对话。它首先检查数据库 A,然后检查数据库 B。它可能会缓存结果。它可能使一个数据库优先于其他数据库。这就是您隐藏在您编写的方便的 REST API 后面的业务逻辑。
现在,您的主项目和子项目针对该现在可操作的中间服务发出 REST 请求。这些请求可能非常简单:这些凭据有效吗?如果是,则在您的项目中建立一个会话。如果会话可移植性很重要,请使用公共库来识别每个会话值。
这种架构感觉是最合乎逻辑的——部分是分开的,业务逻辑包含在各个单元中,没有太多不适当的冗余的机会——但它正危险地转向编写自己的身份验证。您可能会考虑继续硬着头皮实施中间身份验证系统以使用已建立的协议(例如 OAuth)或直接使用 OAuth 系统。
推荐阅读
- python - 删除特殊字符但不删除重音字母
- php - 按另一个数组中给出的特定顺序对数组值进行排序
- django - 如何为规范化数据库构建序列化程序
- go - golang循环初始比剩余慢
- angular - p-confirmDialog 未正确显示
- regex - 获取两个字符之间的文本
- c - 使用 WinAPI 的 InternetReadFile() 进行长轮询
- windows - npm run watch 编译成功,但 laravel Mix 构建成功通知未显示
- c++ - C++ 私有静态 constexpr 成员变量
- regex - 如何使用 ”!” 作为注释指示符,但在语言语法突出显示中也有 NOT 运算符?