我在我的webapp中实现权限功能。客户指定的要求是用户可以根据他们的用户类型执行某些操作。用户类型是基于user_type:user_role
的组合定义的。这是模型:
class User(AbstractUser):
usertype = models.IntegerField(choices=UserType.CHOICES, default=UserType.BUYER_USER)
role = models.IntegerField(choices=UserRole.CHOICES, default=UserRole.NORMAL_USER)
例如我们可以:
adviser:regular
:可以manager_orders
adviser:admin
:可以执行adviser:regular
所做的事情以及manage_advisers
(这不是django admin
,而是顾问的管理员!)(还有更多user_type:user_role
)
这似乎与django permission system冲突,When is a string not a string?基于用户具有的权限,而不是 。
也就是说,在使用django权限系统时,我需要定义所有可能的权限并将这些权限分配给受影响的用户。相反,根据我计划的方法,我需要从user_type:user_role
派生许可。
在此上下文中使用django权限系统是否有意义?如何从user_type:user_role
答案 0 :(得分:1)
如果您不想在评论中坚持@ShangWangs方法,我建议您查看Django Object Based Permissions。 通过这种方式,您可以为用户授予从要应用权限的超级模型派生的对象的权限。
答案 1 :(得分:1)
根据Django文档,您可以使用自定义身份验证后端执行此操作:
https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#handling-authorization-in-custom-backends
任何时候Django需要检查用户是否具有特定权限,它将委托给auth后端,将当前用户对象作为arg传递。此时,您可以检查usertype
和role
字段并返回适当的布尔值。
class SettingsBackend(object):
...
def has_perm(self, user_obj, perm, obj=None):
if user_obj.username == settings.ADMIN_LOGIN:
return True
else:
return False
根据您在问题中描述的内容,您不需要“对象级别”的复杂性。其他人提到的权限(因为您不具备每个用户的唯一权限,它们基于类型和角色)