Django扩展组的权限不适用于用户

问题描述

因此,我扩展了Django的Group模型来添加一个额外的字段,如下所示:

class MyModel(Group):

    extra_field = models.TextField(null=True,blank=True)

这样做时,创建的MyModel的每个实例也会创建一个Group实例。 如果我使用user.groups.add(group)用户添加到结果组中,则该组将按预期添加

但是,MyModel组的权限似乎并没有渗透到用户,即

执行user.get_all_permissions()get_group_permissions()甚至测试user.has_permission(mygroup_permission)都不会返回任何结果。仅显示 pure 组实例(在扩展模型之前创建)的权限。

我需要做些什么来使自定义组的权限在用户上可见吗?

TIA

解决方法

查看默认的django身份验证后端ModelBackend时,您会看到以下内容:

def _get_group_permissions(self,user_obj):
        user_groups_field = get_user_model()._meta.get_field('groups')
        user_groups_query = 'group__%s' % user_groups_field.related_query_name()
        return Permission.objects.filter(**{user_groups_query: user_obj})

很明显,它试图从代表用户组(此处为 groups )的字段中确定权限。由于您的MyModel与djangos用户模型无关,因此您将不会以这种方式获得任何权限。

您现在可以:

  1. 编写自定义用户模型并替换
  2. 的关系
  3. 编写自定义身份验证后端
  4. 使用从MyModel到组的一对一关系

我认为,最简单的方法是在一对一关系中用新模型扩展Group模型。这样,您就可以进一步使用djangos身份验证系统并获得其他可用数据。