【问题标题】:Django how to define permissions so users can only edit certain model hierarchies?Django如何定义权限以便用户只能编辑某些模型层次结构?
【发布时间】:2017-01-17 04:25:08
【问题描述】:

如果我有这样的模型..

class Family(Model):
    name = models.CharField()

class Father(Model):
    family = ForeignKey(Family)

class Mother(Model):
    family = ForeignKey(Family)

class Child(Model):
    family = ForeignKey(Family)

Django 自动生成组权限,因此我可以定义可以编辑/创建/等的组...家庭模型。

如何将其限制为仅允许用户编辑族模型的某个实例?因此,如果我希望“约翰逊”家族管理员仅有权编辑“约翰逊”家族树下的内容。

我可以想到两种方法,一种是定义自定义权限,例如 (https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#custom-permissions),但我不知道文档在那里说什么,他们也没有很好地解释它。

我也可以考虑在用户模型上添加一个字段并检查它的值,但是这样做感觉不对...

【问题讨论】:

  • 我相信 Django 的权限系统无法做到这一点(不确定)。就个人而言,在尝试修改族模型时,我只会检查用户模型。

标签: python django permissions user-permissions


【解决方案1】:

您可以使用提供此功能的 django 模块。 我个人使用django-guardian,它使用类似于原始has_perm 方法的接口提供每个对象的权限。

【讨论】:

    【解决方案2】:

    我可以想出两种方法来实现你想要的,但这只是实验性的,我不知道它是否会遵循良好的做法:

    1 - Programmatically created permissions

    代号部分基于实例。 例如,使用包含用户可以编辑的实例的代号创建权限:

    perm = Permission.objects.create(codename='can_create_'+str(obj.id),
                                     name='can edit instance with id ' + str(obj.id))
    user.user_permissions.add(perm)
    

    然后:

    if user.has_perm('can_create_' + str(relevant_id)):
    

    2 - ManyToMany relationships as permissions

    可能是你自己的领域想法:

    class myModel(models.Model):
        editors = models.ManyToManyField(User, related_name='mymodel_can_edit')
    

    然后只需在其mymodel_can_edit 字段中添加和删除用户可以删除的实例,就像您在其user_permissions 字段中管理权限一样。

    但我没有测试任何这些解决方案。 如果你尝试一下,你能说出你的想法吗? :)

    【讨论】:

    • 我最终使用了选项 2,然后在 CBV 调度方法中添加了一些逻辑来检查他们是否有权限,如果没有则返回 403
    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 2011-11-21
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多