使用请求方法的 Django 动态模型权限



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

相关型号:

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 个默认权限,分别是查看、添加、更改和删除。基于此,我想通过请求方法检查用户权限,这样我就不必为每个模型编写权限类。我也不想使用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。有了这个,我可以创建具有权限的组并设置用户组。我搜索了很多,但找不到任何对我有用的东西。你觉得怎么样?我需要别人的意见。

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

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

最新更新