【问题标题】:Django, DRF - returning a list of user permissions in boolean valuesDjango,DRF - 返回布尔值中的用户权限列表
【发布时间】:2018-03-16 13:26:47
【问题描述】:

我想在 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)

这是我得到的回应:

{
    "permissions": [
        "auth.add_user",
        "auth.add_group",
        "auth.add_userproxy",
        "auth.change_group",
        "auth.change_user",
        "auth.delete_permission",
        "evidence.view_all_customers"
    ]
}

然而,这并不是我想要的。我想返回系统中所有权限的列表,并为给定用户的每个单独权限提供一个真/假值。

当然,我尝试获取完整的权限列表以将它们与用户的权限进行比较,但这是我偶然发现的一个问题:

来自django.contrib.auth.modelsPermission模型,我可以从中获得系统中的完整权限列表,具有以下属性:

namecontent_typecodename。我发现 codename 是我需要的属性,但有一个问题 - 它包含没有前置应用程序名称的名称(例如,只是“add_user”,而不是 User.get_all_permissions() 返回的“auth.add_user”。

这基本上使两者无法比拟。有没有办法很好地做到这一点?我只想将子字符串匹配作为最后的手段,因为我认为这不是一个好习惯。

编辑:根据要求,这是一个示例:

假设系统中有以下权限:

"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"

我想创建一个端点,给定一个用户 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,
    }
}

【问题讨论】:

  • 可以用您的输入和预期输出更新问题吗?

标签: django django-rest-framework


【解决方案1】:

好吧,请记住 super-users 拥有所有权限,因此您可以随时这样做(无需保存任何新用户):

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}

这将返回你想要的字典:

{
    "auth.add_user": True,
    "auth.add_group": False,
    ...
}

【讨论】:

  • 太棒了,它可以工作,而且它不依赖于已经保存在数据库中的超级用户,谢谢! +1
猜你喜欢
  • 2019-03-25
  • 2020-02-13
  • 2021-11-13
  • 2018-12-24
  • 1970-01-01
  • 2013-09-10
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多