多租户集中式身份验证服务器

时间:2018-09-28 21:21:38

标签: django django-rest-framework multi-tenant django-authentication

我正在尝试为多个Django应用(API)创建集中式身份验证服务器。我已经看到过帖子/推荐,但都不完全符合我的需求。

概述:

  • 用户可以与一个或多个项目关联
  • 用户对与其关联的所有项目都具有相同的凭据
  • 使用JSON Web Tokens-使用有效负载添加用户数据,要路由到的子域(项目),角色等
  • 子域将不会用于登录。所有用户都将登录到同一站点,并将被路由到与它们关联的项目(如果有多个,则给定列表)。 SSO是可选的。

问题/不确定性:

问:认证令牌应该在认证服务器上还是在每个项目上创建? ie)每个用户对所有项目都具有一个身份验证令牌,或者对每个项目都具有一个身份验证令牌?

问:角色将存储在每个应用程序中。我想在JWT中发送角色和身份验证令牌。该数据是否应冗余存储在身份验证服务器上?另一种方式是身份验证服务器访问项目数据库。处理此问题的最佳方法是什么?用户对每个项目将具有不同的角色。

Q:Auth服务器将具有基本的用户信息(电子邮件/用户名,密码,姓氏/名字等)。由于不能在数据库之间使用外键,因此我可以使用基于用户名的用户代理在每个项目上创建用户。应用服务器需要访问哪些身份验证令牌有效吗?

利用现有软件的优势:

  • 我想到的另一种方法是使用django-tenant-schemas,它利用了Postgres模式,其中我的每个项目都是一个模式(当前使用MYSQL数据库)。利用这一点有意义吗?
  • 我可以利用IdP服务卸载某些身份验证吗?这是否容易绑定到Django身份验证层?

1 个答案:

答案 0 :(得分:0)

您的问题似乎有多个,所以我也将答案分开:

关于用户

由于您的用户不属于您的“突变模式”,因此在此处有两个选择:

  1. 在不同的租户数据库中复制您的用户数据(通过触发器或其他)。
  2. 编写您自己的身份验证中间件,以验证正确数据库中的用户(从现在起将其称为根数据库)。您可以使用用户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)

现在可以使用身份验证令牌

您具有与上述相同的选择:

  1. 将它们保留在根数据库中并编写自己的中间件。
  2. 复制它们。

如何实现整个过程

由于用例非常特殊,因此您可能会遇到现有软件带来的一些阻力。但是创建自己的多租户解决方案不是that hard