如何获得用户权限?

时间:2013-05-15 19:12:28

标签: python django django-authentication

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

user.get_all_permissions()

给我许可名称列表。怎么做?

6 个答案:

答案 0 :(得分:33)

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

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)

答案 1 :(得分:17)

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

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)]

希望它有所帮助!

答案 2 :(得分:4)

如果使用的是Django 3.0+,则user.get_user_permissions()给出所有权限的代号。

此处提供更多信息:https://docs.djangoproject.com/en/3.0/ref/contrib/auth/#django.contrib.auth.models.User.get_user_permissions

答案 3 :(得分:1)

我们可以将用户对象的用户权限直接发送到像这样的列表中

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

试试这个......

答案 4 :(得分:0)

这是在单个查询中查询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()


答案 5 :(得分:0)

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

permissions[0].id