Django:从user_type

时间:2016-01-25 16:49:31

标签: django

我在我的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

中获取权限

2 个答案:

答案 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传递。此时,您可以检查usertyperole字段并返回适当的布尔值。

来自文档的示例:

class SettingsBackend(object):
    ...
    def has_perm(self, user_obj, perm, obj=None):
        if user_obj.username == settings.ADMIN_LOGIN:
            return True
        else:
            return False

根据您在问题中描述的内容,您不需要“对象级别”的复杂性。其他人提到的权限(因为您不具备每个用户的唯一权限,它们基于类型和角色)