【问题标题】:Django Extended Group's Permissions not applied to usersDjango 扩展组的权限不适用于用户
【发布时间】:2020-12-19 01:28:06
【问题描述】:

所以我扩展了 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) 不会返回任何结果。仅显示来自组实例(在扩展模型之前创建)的权限。

我需要做些什么才能让用户看到自定义组的权限吗?

TIA

【问题讨论】:

    标签: python django django-authentication django-auth-models


    【解决方案1】:

    当你查看ModelBackend,默认的 django 身份验证后端时,你可以看到:

    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. 使用从 MyModel 到组的一对一关系

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

    【讨论】:

    • 谢谢伊夫。我最大的问题/用例是一个人属于多个组织并且在每个组织中拥有不同的权利。即仅在 OrgA 中读取 X,但在 OrgB 中授予 X 的所有权利。这能做到吗?
    • 我的荣幸。如果我猜对了,一个人可以对他所属组织的不同对象拥有不同的权限吗?如果是这样,这超出了 djangos 组系统的能力。有第三方应用可以解决这个问题:look this question
    • 完美。感谢您为我指明这个方向。干杯!
    猜你喜欢
    • 2012-05-05
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2021-06-15
    • 2012-06-21
    • 2018-04-28
    相关资源
    最近更新 更多