Python 不同客户端的Django权限
我正在从事一个Django项目,该项目将以公司为客户,每个客户都可以创建多个用户。然后可以为这些用户分配不同的权限或角色 问题在于,权限的类型因客户端而异,即它们不像读、写、删除那样简单。因此,一个客户端只能有5-10种类型的权限,而另一个客户端可以有100种类型的权限 内置的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,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']
通过使用这个,你将有一个完全不同的