Django,DRF - 返回布尔值中的用户权限列表

use*_*186 6 django django-rest-framework

我想在 Django/DRF 中实现以下目标:

实现一个端点,根据给定的用户 ID,返回其权限列表。(我的意思是模型UserPermission来自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获取系统中完整的权限列表的模型具有以下属性:

namecontent_typecodename。我发现这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)

Séb*_*rez 5

好吧,请记住,根据定义,超级用户拥有所有权限,因此您始终可以执行以下操作(无需保存任何新用户):

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)