python 如何获取用户权限?

91zkwejq  于 2023-02-02  发布在  Python
关注(0)|答案(8)|浏览(297)

我想检索用户的所有权限作为权限ID的列表,但:

user.get_all_permissions()

给予我权限名称列表。2怎么做?

3df52oht

3df52oht1#

获取给定用户的所有权限,以及与该用户所属组关联的权限:

from django.contrib.auth.models import Permission

def get_user_permissions(user):
    if user.is_superuser:
        return Permission.objects.all()
    return user.user_permissions.all() | Permission.objects.filter(group__user=user)
5f0d552i

5f0d552i2#

关键是像这样获取权限对象:

from django.contrib.auth.models import Permission
permissions = Permission.objects.filter(user=user)

在那里你可以访问id属性,如下所示:

permissions[0].id

如果需要列表(id, permission_name),请执行以下操作:

perm_tuple = [(x.id, x.name) for x in Permission.objects.filter(user=user)]

希望能有所帮助!

hgqdbh6s

hgqdbh6s3#

如果你使用的是Django 3.0+,user.get_user_permissions()会给出所有权限的代号。
更多信息请访问:www.example.comhttps://docs.djangoproject.com/en/3.0/ref/contrib/auth/#django.contrib.auth.models.User.get_user_permissions

rsl1atfo

rsl1atfo4#

我们可以将用户权限从用户对象直接放到如下列表中

perm_list = user_obj.user_permissions.all().values_list('codename', flat=True)

试试这个...

niknxzdl

niknxzdl5#

这是一个例程,用于在单个查询中查询user.get_all_permissions()返回的Permission对象。

from functools import reduce
from operator import or_
from django.db.models import Q
from django.contrib.auth.models import Permission

def get_user_permission_objects(user):
    user_permission_strings = user.get_all_permissions()
    if len(user_permission_strings) > 0:
        perm_comps = [perm_string.split('.', 1) for perm_string in user_permission_strings]
        q_query = reduce(
            or_,
            [Q(content_type__app_label=app_label) & Q(codename=codename) for app_label, codename in perm_comps]
        )
        return Permission.objects.filter(q_query)
    else:
        return Permission.objects.none()

或者直接查询权限:

from django.db.models import Q
from django.contrib.auth.models import Permission

def get_user_permission_objects(user):
    if user.is_superuser:
        return Permission.objects.all()
    else:
        return Permission.objects.filter(Q(user=user) | Q(group__user=user)).distinct()
htzpubme

htzpubme6#

from django.contrib.auth.models import Permission
permissions = Permission.objects.filter(user=user)

permissions[0].id
aamkag61

aamkag617#

返回user_obj具有的权限字符串集,包括用户权限和组权限。如果is_anonymous或is_active为False,则返回空集。
user_permissions_list = request.user.get_all_permissions()
返回user_obj从其所属组的权限中获得的权限字符串集。如果is_anonymous或is_active为False,则返回空集。
request.user.get_group_permissions()
返回user_obj从其自己的用户权限中获得的权限字符串集。如果is_anonymous或is_active为False,则返回空集。
request.user.get_user_permissions()
不幸的是,这些内置的方法给予我重复的查询。
也可以使用权限表中自己的过滤器获取当前用户的所有权限
user_permissions_list = list(Permission.objects.filter(Q(user=request.user) | Q(group__user=request.user)).values_list('codename', flat=True))
文件

enxuqcxy

enxuqcxy8#

对@Shihabudheen K M答案的扩展和解释
我们可以直接从用户对象中获取用户权限,查询集如下所示

perm_queryset = user_obj.user_permissions.all().values_list('id')

在这种情况下获得的查询集具有以下格式:

<QuerySet [(31,), (16,), (11,), (35,), (18,), (36,)]>

用户权限的扁平查询集:

flattened_perm_queryset = user_obj.user_permissions.all().values_list('id', flat=True)

输出:

<QuerySet [31, 16, 11, 35, 18, 36]>

要获取用户的这些权限的ID列表,您可以执行以下操作:

perm_list = list(user_obj.user_permissions.all().values_list('id', flat=True))

输出:

[31, 16, 11, 35, 18, 36]

希望这是有帮助的!

相关问题