django - 多租户集中认证服务器
问题描述
我正在尝试为多个 Django 应用程序(API)创建一个集中式身份验证服务器。我看过帖子/建议,但没有一个完全符合我的要求。
概述:
- 用户可以关联到一个或多个项目
- 用户对他们关联的所有项目具有相同的凭据
- 使用JSON Web Tokens - 使用有效负载添加用户数据、子域(项目)以路由到、角色等
- 子域不会用于登录。所有用户都将登录到同一个站点,并将被路由到他们关联的项目(如果有多个,则为给定列表)。SSO 是可选的。
问题/不确定性:
问:身份验证令牌应该在身份验证服务器上创建还是在每个项目上创建?即)每个用户对所有项目都有一个身份验证令牌,还是每个项目都有一个身份验证令牌?
问:角色将存储在每个应用程序中。我想将角色与 JWT 中的身份验证令牌一起发送。这些数据是否应该冗余存储在身份验证服务器上?另一种方法是让身份验证服务器访问项目数据库。处理这个问题的最佳方法是什么?对于每个项目,用户将具有不同的角色。
问:身份验证服务器将包含基本用户信息(电子邮件/用户名、密码、名字/姓氏等)。由于数据库之间不能使用外键,我可以使用基于用户名的用户代理在每个项目上创建用户。应用服务器是否需要访问哪些身份验证令牌是有效的?
利用预先存在的软件:
- 我想到的另一种方法是使用 django-tenant-schemas,它利用 Postgres 模式,其中我的每个项目都是一个模式(目前使用 MYSQL 数据库)。利用这一点有意义吗?
- 我可以利用 IdP 服务来卸载一些身份验证吗?这很容易与 Django auth 层联系起来吗?
解决方案
您的问题似乎是多重的,所以我也会拆分答案:
关于用户
由于您的用户不是您的“mutitencancy 模型”的一部分,因此您有两个选择:
- 在不同的租户数据库之间复制您的用户数据(通过触发器等等)。
- 编写您自己的身份验证中间件,以验证正确数据库中的用户(从现在起我们将其称为根数据库)。您可以使用来自根数据库的用户 ID 并手动验证它们是否匹配,这是一个坏主意。
这意味着您的数据库架构将是这样的:
root database (all common data here)
project 1 database (with it's own user data or referencing root)
project 2 database (with it's own user data or referencing root)
现在用于身份验证令牌
您有与上述相同的选项:
- 将它们保存在根数据库中并编写您自己的中间件。
- 复制它们。
如何实现整个事情
由于您的用例非常特殊,您可能会遇到来自现有软件的一些阻力。但是创建自己的多租户解决方案并不难