Python 不同客户端的Django权限

Python 不同客户端的Django权限,python,django,database-design,permissions,authorization,Python,Django,Database Design,Permissions,Authorization,我正在从事一个Django项目,该项目将以公司为客户,每个客户都可以创建多个用户。然后可以为这些用户分配不同的权限或角色 问题在于,权限的类型因客户端而异,即它们不像读、写、删除那样简单。因此,一个客户端只能有5-10种类型的权限,而另一个客户端可以有100种类型的权限 内置的Django权限框架不直接支持我的用例,因此我提出了以下建议: 创建一个包含用户模型的django主应用程序 对于每个新客户机,创建一个仅使用models.py的新django应用程序 py只有一个模型(目前)本身包含特定

我正在从事一个Django项目,该项目将以公司为客户,每个客户都可以创建多个用户。然后可以为这些用户分配不同的权限或角色

问题在于,权限的类型因客户端而异,即它们不像读、写、删除那样简单。因此,一个客户端只能有5-10种类型的权限,而另一个客户端可以有100种类型的权限

内置的Django权限框架不直接支持我的用例,因此我提出了以下建议:

  • 创建一个包含用户模型的django主应用程序
  • 对于每个新客户机,创建一个仅使用models.py的新django应用程序
  • py只有一个模型(目前)本身包含特定于该客户机的权限,如前所述
  • 现在,我可以根据用户所属的客户端为每个用户分配权限
  • 虽然我还没有测试过,但应该可以。该解决方案看起来是可伸缩的,但存在很多不一致之处,而且似乎不是正确的方法。附近有工作吗

    更新:看起来可能会有帮助,但不确定如何

    更新:我想我会解释整个架构,因为当前的解决方案不能直接用于它

  • 有时间序列数据流,数据以固定的间隔进入。每个客户端可以有100到1000个这样的流。但是,这些流不会保存在Web服务器数据库中,而是保存在每个客户端的不同数据库中
  • 现在,用户可以拥有查看上述所有、一个或部分流的权限。客户端让我们知道他们想要创建的用户类型,我们相应地创建一个
  • 为了进行身份验证,最好将所有用户放在一个表中。但是对于授权来说,将每个客户机用户放在一个单独的表上是有意义的。在我看来,最好把客户分开
  • 有点离题,但我们正在考虑为每个客户机提供一个单独的共同域,如client1.mysite.com、client2.mysite.com等,因此我们可以自由地为每个客户机部署不同的web服务器,从而为每个客户机定制。此外,这有助于以不同的方式存储每个客户机用户的数据
    我真的不喜欢你的解决方案-它类似于旧的数据库设计,在旧的数据库设计中,模式改变是设计所期望的!!!求你了,不管付出什么代价,都不要这样做。忘记django,40年的数据库设计告诉我们,数据库的模式永远不应该改变(当然,除非需求改变或者您的设计不正确)。我可以提供一个类似的答案:强调而不是更改数据库模式的重要性

    因此,您将拥有一个django应用程序,其中包含您所说的用户模型和一个
    CustomPermission
    模型,该模型将为管理员提供一个界面,以便他为eah客户端添加权限(管理员将为客户端添加权限,而不是为开发人员添加权限)。每个
    CustomPermission
    对其应用的客户机只有一个名称和一个
    ForeignKey

    现在,您可以创建一个
    UserCustomPermission
    模型,该模型将有一个
    ForeignKey
    User
    和另一个
    ForeignKey
    CustomPermission
    (实际上,
    User
    CustomPermission
    之间存在多对多关系)

    现在,您需要实现的是如何将您分配的权限分配给实际允许和禁止的操作。您在问题中没有对此做任何说明。只是给您一个指导,我非常喜欢(并且一直使用)django rules light应用程序(),它可以用来定义您的业务规则

    也许我的答案并不能真正解决你的问题,或者我不明白什么,但我相信你会有一个起点——也可以随时更新你的问题,我会相应地更新我的答案

    对更新的回答

    正如您所理解的,我不喜欢1和3:对于每个新客户机,您都需要创建一个新的数据库?为什么不将所有客户机流放在同一个表中,并对它们所属的客户机使用外键

    (这里是龙)

    我认为这是一个很好的解决方案-我不会这么做,但是如果您非常想将您的用户及其权限放在不同的数据库中,那么您可以提前使用单独的子域:使用数据库路由()根据子域选择每个客户机的数据库。因此,您将在设置中定义所有客户机的数据库。py:

    DATABASES = { 'default': { 'NAME': 'app_data', 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'USER': 'postgres_user', 'PASSWORD': 's3krit' }, 'client1': { 'NAME': 'client2', 'ENGINE': 'django.db.backends.mysql', 'USER': 'client2', 'PASSWORD': 'priv4te' }, 'client2': { 'NAME': 'client1', 'ENGINE': 'django.db.backends.mysql', 'USER': 'client1', 'PASSWORD': 'priv4te' } } 数据库={ “默认值”:{ “名称”:“应用程序数据”, “引擎”:“django.db.backends.postgresql_psycopg2”, “用户”:“postgres_用户”, “密码”:“s3krit” }, “客户1”:{ 'NAME':'client2', 'ENGINE':'django.db.backends.mysql', “用户”:“客户端2”, “密码”:“priv4te” }, “客户2”:{ 'NAME':'client1', 'ENGINE':'django.db.backends.mysql', “用户”:“客户端1”, “密码”:“priv4te” } } 然后,您将创建一个
    子域DatabaseRouter
    类,该类将根据您的子域使用正确的数据库。因为请求设置在该类中不可用,您必须使用中间件和线程局部变量将它们放在那里。请看以下代码片段

    因此,在您的
    RouterMiddleware
    中,您将检查以查看子域,并根据子域设置一个带有客户端名称的
    client\u cfg
    选项。您的
    子域数据库路由器将根据
    client\u cfg
    使用正确的数据库。要使用它,只需添加

    数据库路由器=['my.package.SubDomainDatabaseRouter']

    通过使用这个,你将有一个完全不同的