我正在一个Django项目将采取对企业的客户,每个客户端将被允许创建多个用户。 然后,这些用户可以分配不同的权限或角色。
美中不足之处在于权限的类型而不同与客户,即它们没有读那么简单,写,删除。 因此,一个客户端只能有5-10个类型的权限,而其他可以有100的。
内置的Django的权限框架不直接支持我的用例,所以这是我想出了:
- 创建一个主Django应用程序里面有用户模型
- 对于每一个新客户,创建一个只models.py一个新的Django应用程序
- 该models.py只有一个模型(暂时),这本身设有专用于该客户端的权限解释这里 。
- 现在我可以分配取决于哪个客户端的用户是其中一部分的每个用户的权限。
虽然我没有测试它,这应该工作。 该解决方案可扩展的外观,但也有很多不一致的,它似乎并不像做正确的方式。 有没有解决办法?
更新: Django的监护人看起来像它可以帮助,不知道如何。
更新:我想我会解释整个架构,因为当前的解决方案并没有为它直接工作。
- 有数据定期到来的时间序列数据流。 每个客户端可以有超过1000个这样的流随时随地100之间。 这些流但没有保存在Web服务器DB但保存在每个客户不同的数据库。
- 现在,用户可以有权查看或者全部,一个,或上述的一些流。 客户让我们知道他们想要创建和我们据此建立一个用户类型。
- 认证的目的,它能够更好地让所有用户在一个表中。 但对于授权是有意义的有一个单独的表中的每个客户端的用户。 这是最好的,在我看来,以隔离客户端。
- 稍微偏离主题,但我们正在寻找在提供每个客户一个单独的合作领域一样client1.mysite.com,client2.mysite.com等,因此我们可以自由地为每个客户端部署不同的Web服务器,从而自定义为每一个客户端。 此外,这有助于存储每个客户端的用户的数据不同。
我真的不喜欢你的解决方案-这是类似的地方架构chnges被设计预期旧数据库的设计! 请不惜一切代价不这样做。 忘记了Django的40年代的数据库设计已经因子评分我们,数据库的模式应该永远不会改变(当然,除非要求更改或你的设计是不正确的)。 我公司可提供类似于这样的答案: 除了XHTML自足标签的正则表达式匹配开放标签来强调的是多么的重要, 不会改变你的数据库架构。
所以,你将有一个Django应用程序,你说里面有用户模型和CustomPermission
模式,这将给一个接口的admininstrator让他将添加权限EAH客户端(管理员将添加权限的客户端,而不是开发者)。 每个CustomPermission
只会有一个名字和一个ForeignKey
其所适用的客户端。
现在,您可以创建一个UserCustomPermission
这将有一个模型ForeignKey
对User
和另一个ForeignKey
到CustomPermission
(实际之间是有很多一对多关系User
和CustomPermission
。
现在,你需要实现的是如何分配的权限将被分配到实际允许的,forbidded行动 。 你不说这个你的问题中任何东西。 只是给你一个方向,我真的很喜欢(和使用所有的时间)Django的规则-轻量级应用( https://github.com/yourlabs/django-rules-light可用于定义业务规则) 。
也许我的回答并没有真正解决您的问题,或者我不明白的东西,但我相信,你会得到一个起点 - 也随时更新你的问题,我会相应地更新我的答案。
回答到更新
正如你所了解的,我不喜欢1和3:对于每一个新的客户端,您将需要创建一个新的数据库? 为什么不把所有的客户端数据流在同一个表,并使用一个外键,它们属于客户端?
(此处DRAGONS)
我想到了一个很好的解决方案-我不会做,但如果要那么多把你的用户和他们在不同的数据库的权限,那么你可以使用单独的子域名加入事先:使用数据库路由( https://开头的文档.djangoproject.com / EN / 1.3 /主题/ DB /多DB /#数据库路由器 )来选择每一个客户的数据库取决于子域。 所以,你会定义都在你的settings.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'
}
}
然后你将创建一个SubDomainDatabaseRouter
将使用正确的数据库根据您的子域类。 由于要求设置不可用在类,你必须使用中间件和线程当地人把它们放在那里。 看看下面的代码片段
https://djangosnippets.org/snippets/2037/
因此,在您RouterMiddleware
您将检查子站点,并根据您将设置一个client_cfg
与客户的名称选项。 你SubDomainDatabaseRouter
将使用取决于正确的数据库client_cfg
。 要使用它只需添加
DATABASE_ROUTERS = ['my.package.SubDomainDatabaseRouter']
利用这一点,你必须为每个客户端完全不同的数据库。 我需要再次强调的是,你将有一个地狱维护它 - 让我们假设你有100个客户,需要一个字段添加到表。 然后呢? 请不要怪我:)
(OF END DRAGONS)