我正在尝试构建一个多租户 API,到目前为止,我的 API 运行良好,我设法实现了多租户(使用 archtechx/tenancy),使用 sanctum 颁发密钥进行身份验证也工作正常。
该应用程序的结构是这样的,例如有一个中央域example.com
,有权访问此域的用户称为"超级管理员",他们应该能够使用他们的 API 令牌(由 Sanctum 在登录时颁发)访问所有其他子域(或租户)API,不受限制地访问。
租户位于子域(如tenant.example.com
)上,并具有个人数据库,每个租户一个。
我正在考虑实现这一点的几种解决方案:
- 让超级管理员模拟租户 API 的管理员并以该管理员的身份执行操作
- 找到一种方法,向在每个租户(子域)上运行的超级管理员颁发"主密钥">
我会倾向于第二种解决方案,因为我发现它更优雅。我一直在网络上搜索此类问题/功能的最佳实践,但我没有找到与我的问题完全匹配的任何内容。
总之,解决方案2可行吗?如果是这样,有没有办法用庇护所发出这样的"万能钥匙"?
我正在使用:
拉拉维尔 8.48.1
Lighthouse-php 作为通过 Laravel 为 GraphQL 服务的框架
圣所作为身份验证守卫
Laravel的租赁作为多租户套餐
主密钥
一个简单的想法:你可以为Sanctum代币设置代币能力。也许您可以创建master:access
或类似的东西的能力,作为Master key
?您可以在为超级用户创建 API 令牌时授予他们master:access
能力。
这确实需要tenant
访问master
数据库并授权该特定密钥的功能。我不知道该软件包的具体实现,但是我之前使用的租赁项目提供了对master
数据库的轻松访问。您可以实现某种中间件或授权来检查用户是否具有具有master:access
功能的令牌。
模拟用户
您提出的其他模拟解决方案似乎也是可能的,并且根据包文档由包提供。这确实要求每个租户都有某种admin
用户。由于所有Superadmins
都可以通过 1 个共享admin
用户访问租户,因此我不建议使用此选项。