【问题标题】:Django dynamic model permission using request methodDjango动态模型权限使用请求方法
【发布时间】:2020-09-15 11:39:09
【问题描述】:

我在一家使用机器和模具生产工业零件的公司工作。在生产过程中,机器可能会发生故障,因此我们为工人创建了一个前端和后端来记录这些错误记录。最近来自其他部门的工程师和经理加入了这个系统,所以我需要确定谁可以做什么,换句话说就是管理权限

相关型号:

class FaultRecord(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
    fault = models.ForeignKey(Fault, on_delete=models.PROTECT)
    machine = models.ForeignKey(Machine, on_delete=models.PROTECT)
    mold = models.ForeignKey(Mold, on_delete=models.PROTECT)
    part = models.ForeignKey(Part, on_delete=models.PROTECT)
    material = models.ForeignKey(Material, on_delete=models.PROTECT)
    responsible_departments = models.ManyToManyField(Department)
    status = models.ForeignKey(FaultRecordStatus, on_delete=models.SET_NULL, null=True)
    reason = models.TextField()
    temporary_action = models.TextField()
    permanent_action = models.TextField(null=True)
    duration = models.PositiveSmallIntegerField()
    occured_at = models.DateTimeField()
    created_at = models.DateTimeField()
    updated_at = models.DateTimeField(null=True)

相关观点:

class FaultRecordViewSet(ModelViewSet):
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated, ModelPermission]
    serializer_class = FaultRecordSerializer
    queryset = FaultRecord.objects.prefetch_related(
        'user',
        'fault',
        'machine',
        'mold',
        'part',
        'material',
        'responsible_departments',
        'status'
    ).all().order_by('occured_at')
    model = FaultRecord

众所周知,Django 为查看、添加、更改和删除的模型创建4 default permission。基于此,我想通过请求方法检查用户权限,因此我不必为每个模型编写权限类。另外我不想使用 has_object_permission 因为我也检查了发布权限。

我找到的解决方案:

class ModelPermission(BasePermission):
    method_mapper = {
        'GET': 'view',
        'POST': 'add',
        'PUT': 'change',
        'PATCH': 'change',
        'DELETE': 'delete'
    }

    def get_model_permission(self, method, model):
        app_label = model._meta.app_label
        model_name = model._meta.model_name
        permission_name = self.method_mapper.get(method)
        return f'{app_label}.{permission_name}_{model_name}'

    def has_permission(self, request, view):
        if request.method in SAFE_METHODS:
            return True
        permission = self.get_model_permission(request.method, view.model)
        return request.user.has_perm(permission)

我在视图类中添加了模型属性,因此 get_model_permission 返回所需的字符串以便能够为我使用 has_perm。有了这个,我可以创建具有权限的组并设置用户组。我搜索了很多,但找不到任何对我有用的东西。你怎么看?我需要别人的意见。

【问题讨论】:

    标签: python django api permissions backend


    【解决方案1】:

    您正朝着正确的方向前进,但我建议使用 DjangoModelPermissions 而不是 BasePermission。 DjangoModelPermissions 实现了 get_required_permissions 和 has_permission 函数,因此您无需自己编写这些函数。如果您不想检查对象权限,请在您的视图集中分配 DjangoModelPermissions。

    您对管理组的权限是正确的。创建组并将权限分配给这些组,然后将组分配给用户。如果情况需要,您还可以直接为用户分配一些权限。 DjangoModelPermissions 的 has_permission 默认检查分配给用户和用户组的权限。

    【讨论】:

    • 我刚刚检查了 DjangoModelPermissions 的源代码,这就是我所需要的,也是我写的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多