如何获得用户权限?

Nip*_*ips 25 python django django-authentication

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

user.get_all_permissions()
Run Code Online (Sandbox Code Playgroud)

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

DRC*_*DRC 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)
Run Code Online (Sandbox Code Playgroud)

  • 我想 `return Permission.objects.filter(Q(group__in=user.groups.all())|Q(user=user)).distinct()` 也会删除数据。 (4认同)
  • 这是一个删除重复项的选项(大概是因为它们是组和用户权限):`list(set(set(chain(user.user_permissions.filter(content_type = ctype).values_list('codename',flat = True),Permission.objects) .filter(group__user = user,content_type = ctype).values_list('codename',flat = True))))`可疑链有时比|更有效。不需要进行values_list调用和按内容类型进行过滤,但是根据您的需要,它们是进一步的选择。 (2认同)

Pau*_* Bu 17

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

from django.contrib.auth.models import Permission
permissions = Permission.objects.filter(user=user)
Run Code Online (Sandbox Code Playgroud)

在那里你可以访问这样的id属性:

permissions[0].id
Run Code Online (Sandbox Code Playgroud)

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

perm_tuple = [(x.id, x.name) for x in Permission.objects.filter(user=user)]
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • 如果用户在具有该权限的组中怎么办? (2认同)

atb*_*ker 8

如果您使用的是 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


Shi*_*K M 7

我们可以从用户对象中直接获取用户权限到这样的列表中

perm_list = user_obj.user_permissions.all().values_list('codename', flat=True)
Run Code Online (Sandbox Code Playgroud)

尝试这个....


Mor*_*itz 5

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()
Run Code Online (Sandbox Code Playgroud)

或者,直接查询权限:

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


Run Code Online (Sandbox Code Playgroud)