Django 超级用户没有所有权限
Django superuser not having all permissions
在尝试创建用于显示用户权限的 Django Rest Framework 端点时,我遇到了有关超级用户的问题。
我原以为超级用户默认拥有所有权限,但当我尝试通过权限模型获取任何用户的所有权限时,我发现列表之间存在长度差异。
# User is a superuser
> len(user.get_all_permissions())
516
> len(Permission.objects.all().distinct())
519
由于 get_all_permissions() returns 是一个字符串列表,这些字符串是来自权限而不是 QuerySet 的数据的一些排列,我无法确切地看到超级用户缺少哪些权限。
我认为超级用户拥有所有权限的印象是错误的吗?是否有其他方法以权限查询集的形式获取用户的所有权限?
我总是可以 return user.get_all_permissions() 给出的列表而不是 QuerySet,但是当涉及到可能的响应格式时,这会使 DRF-Swagger 感到困惑。
Since get_all_permissions() returns a list instead of a QuerySet, I am unable to see exactly which permissions the superuser lacks.
怎么会这样?像
all_permission_ids = {
f'{app_label}.{codename}'
for (app_label, codename)
in Permission.objects.values_list('content_type__app_label', 'codename')
}
missing_permissions = (
all_permission_ids -
set(user.get_all_permissions())
)
应该让你继续。
Am I wrong in my impression that a superuser has all permissions?
不,你不是。超级用户确实拥有所有权限,一般是short-circuited,即你只检查用户是否是超级用户,如果是,则不应再进行权限检查。
Are there other ways to get all permissions for a user in the form of a Permission QuerySet?
有点。像
user_permissions_qs = Permission.objects.filter(id__in={p.id for p in user.get_all_permissions()})
可以工作,但确实不是最佳选择 performance-wise。
在尝试创建用于显示用户权限的 Django Rest Framework 端点时,我遇到了有关超级用户的问题。
我原以为超级用户默认拥有所有权限,但当我尝试通过权限模型获取任何用户的所有权限时,我发现列表之间存在长度差异。
# User is a superuser
> len(user.get_all_permissions())
516
> len(Permission.objects.all().distinct())
519
由于 get_all_permissions() returns 是一个字符串列表,这些字符串是来自权限而不是 QuerySet 的数据的一些排列,我无法确切地看到超级用户缺少哪些权限。
我认为超级用户拥有所有权限的印象是错误的吗?是否有其他方法以权限查询集的形式获取用户的所有权限? 我总是可以 return user.get_all_permissions() 给出的列表而不是 QuerySet,但是当涉及到可能的响应格式时,这会使 DRF-Swagger 感到困惑。
Since get_all_permissions() returns a list instead of a QuerySet, I am unable to see exactly which permissions the superuser lacks.
怎么会这样?像
all_permission_ids = {
f'{app_label}.{codename}'
for (app_label, codename)
in Permission.objects.values_list('content_type__app_label', 'codename')
}
missing_permissions = (
all_permission_ids -
set(user.get_all_permissions())
)
应该让你继续。
Am I wrong in my impression that a superuser has all permissions?
不,你不是。超级用户确实拥有所有权限,一般是short-circuited,即你只检查用户是否是超级用户,如果是,则不应再进行权限检查。
Are there other ways to get all permissions for a user in the form of a Permission QuerySet?
有点。像
user_permissions_qs = Permission.objects.filter(id__in={p.id for p in user.get_all_permissions()})
可以工作,但确实不是最佳选择 performance-wise。