在 Django Guardian 中,如何确定哪个组授予了用户对对象实例的权限?
In Django guardian, how can I determine which group gave the user permissions to the object instance?
我正在尝试使用 Django guardian 和组设置对象级权限;我根据需要向组(而不是用户)和组中的 add/remove 用户授予权限。
当用户有权与对象实例交互时 - 因为他们在具有必要权限的组中 - 我如何确定是哪个用户组授予了他们权限?
例如,构建 example in the django-guardian-docs ,理想情况下应该是这样的:
>>> joe.has_perm_from_groups('sites.change_site', site)
[site_owners_group]
Django Guardian 有一个名为 get_groups_with_perms(obj)
的快捷方式,即 Returns queryset of all Group objects with any object permissions for the given obj
。 https://django-guardian.readthedocs.io/en/stable/api/guardian.shortcuts.html#get-groups-with-perms
Django 有一个名为 intersection
的查询集方法 returns the shared elements of two or more QuerySets
https://docs.djangoproject.com/en/3.2/ref/models/querysets/#intersection
使用这两个函数,我可以找到用户所在的组也对该对象具有权限。然后我使用 for 循环来识别具有权限的组。如果两个组都有权限,我不知道如何计算出哪个组给了用户权限,所以返回找到的第一个组。
# Find the union of groups
groups = user.groups.all().intersection(get_groups_with_perms(obj))
# Check if any group has the permission, and return if True
for group in groups:
if 'change_site' in get_perms(group, obj):
return group
return None
我正在尝试使用 Django guardian 和组设置对象级权限;我根据需要向组(而不是用户)和组中的 add/remove 用户授予权限。
当用户有权与对象实例交互时 - 因为他们在具有必要权限的组中 - 我如何确定是哪个用户组授予了他们权限?
例如,构建 example in the django-guardian-docs ,理想情况下应该是这样的:
>>> joe.has_perm_from_groups('sites.change_site', site)
[site_owners_group]
Django Guardian 有一个名为 get_groups_with_perms(obj)
的快捷方式,即 Returns queryset of all Group objects with any object permissions for the given obj
。 https://django-guardian.readthedocs.io/en/stable/api/guardian.shortcuts.html#get-groups-with-perms
Django 有一个名为 intersection
的查询集方法 returns the shared elements of two or more QuerySets
https://docs.djangoproject.com/en/3.2/ref/models/querysets/#intersection
使用这两个函数,我可以找到用户所在的组也对该对象具有权限。然后我使用 for 循环来识别具有权限的组。如果两个组都有权限,我不知道如何计算出哪个组给了用户权限,所以返回找到的第一个组。
# Find the union of groups
groups = user.groups.all().intersection(get_groups_with_perms(obj))
# Check if any group has the permission, and return if True
for group in groups:
if 'change_site' in get_perms(group, obj):
return group
return None