use*_*186 6 django django-rest-framework
我想在 Django/DRF 中实现以下目标:
实现一个端点,根据给定的用户 ID,返回其权限列表。(我的意思是模型User和Permission来自django.contrib.auth.models)。
现在,这非常简单,我可以使用下面的代码来获取这些内容:
class UserPermissions(RetrieveUpdateDestroyAPIView):
serializer_class = PermissionSerializer
def get(self, request, pk):
permissions = User.objects.get(pk=pk).get_all_permissions()
print User.objects.get(pk=pk).user_permissions
data = {
'permissions': permissions
}
serializer = PermissionSerializer(data)
return Response(serializer.data, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)
这是我得到的回应:
{
"permissions": [
"auth.add_user",
"auth.add_group",
"auth.add_userproxy",
"auth.change_group",
"auth.change_user",
"auth.delete_permission",
"evidence.view_all_customers"
]
}
Run Code Online (Sandbox Code Playgroud)
然而,这并不完全是我想要的。我想返回系统中所有权限的列表,其中包含给定用户的每个单独权限的真/假值。
当然,我尝试获取完整的权限列表,将它们与用户的权限进行比较,但这就是我偶然发现一个问题的地方:
Permission我可以从中django.contrib.auth.models获取系统中完整的权限列表的模型具有以下属性:
name,content_type和codename。我发现这codename是我需要的属性,但有一个问题 - 它包含没有前置应用程序名称的名称(例如,只是“add_user”,而不是User.get_all_permissions().
这基本上使得两者没有可比性。有没有办法很好地做到这一点?我只想将子字符串匹配作为最后的手段,因为我认为这不是一个好的做法。
编辑:根据要求,这是一个示例:
假设系统中有以下权限:
"auth.add_user",
"auth.add_group",
"auth.add_userproxy",
"auth.change_group",
"auth.change_user",
"auth.delete_permission",
"evidence.view_all_customers"
"contenttypes.add_contenttype",
"evidence.view_all_demands",
"evidence.delete_supplier"
Run Code Online (Sandbox Code Playgroud)
我想创建一个端点,给定用户 ID,该端点返回以下内容:
{
"permissions": {
"auth.add_user" : True,
"auth.add_group" : True,
"auth.add_userproxy" : False,
"auth.change_group" : False,
"auth.change_user" : True,
"auth.delete_permission" : False,
"evidence.view_all_customers" : False,
"contenttypes.add_contenttype" : True,
"evidence.view_all_demands" : False,
"evidence.delete_supplier" : True,
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,请记住,根据定义,超级用户拥有所有权限,因此您始终可以执行以下操作(无需保存任何新用户):
all_permissions = set(User(is_superuser=True).get_all_permissions())
user_permissions = User.objects.get(pk=pk).get_all_permissions()
return {p: p in user_permissions for p in all_permissions}
Run Code Online (Sandbox Code Playgroud)
这将返回您想要的字典:
{
"auth.add_user": True,
"auth.add_group": False,
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1897 次 |
| 最近记录: |