Django 扩展组的权限不适用于用户
Django Extended Group's Permissions not applied to users
所以我扩展了 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)
returns 什么都不做。仅显示来自 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 用户模型,所以你不会通过这种方式获得任何权限。
您现在可以:
- 编写自定义用户模型并替换groups
的关系
- 编写自定义身份验证后端
- 使用 One-To-One-Relation 从 MyModel 到组
在我看来,最简单的方法是在 One-To-One 关系中使用新模型扩展组模型。这样您就可以进一步使用 djangos 身份验证系统并获得额外的数据。
所以我扩展了 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)
returns 什么都不做。仅显示来自 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 用户模型,所以你不会通过这种方式获得任何权限。
您现在可以:
- 编写自定义用户模型并替换groups 的关系
- 编写自定义身份验证后端
- 使用 One-To-One-Relation 从 MyModel 到组
在我看来,最简单的方法是在 One-To-One 关系中使用新模型扩展组模型。这样您就可以进一步使用 djangos 身份验证系统并获得额外的数据。