复杂的Django权限

时间:2018-05-25 17:32:02

标签: python django permissions django-guardian

我在django项目中使用以下模型。有效的关系是,学区可以有多个学校,学校可以有多个学生,学生可以有多个学校。

class District(models.Model):
    name = models.CharField(max_length=50)
    ...
    class Meta:
        permissions = (
            ('view_district', 'Can view district')
            ...
        )

class School(models.Model):
    name = models.CharField(max_length=50)
    ...
    district = models.ForeignKey(
        District,
        on_delete=models.PROTECT,
        related_name='schools',
        related_query_name='school',
    )
    class Meta:
        permissions = (
            ('view_school', 'Can view school')
            ...
        )

class Student(models.Model):
    name = models.CharField(max_length=50)
    ...  
    school = models.ForeignKey(
        School,
        on_delete=models.PROTECT,
        related_name='students',
        related_query_name='student',
    )
    class Meta:
        permissions = (
            ('view_student', 'Can view student')
            ...
        )

class Case(models.Model):
    name = models.CharField(max_length=50)
    ...
    student = models.ForeignKey(
        Student,
        on_delete=models.PROTECT
        related_name='cases',
        related_query_name='case',
    )
    class Meta:
        permissions = (
            ('view_case', 'Can view case')
            ...
        )

可能会为用户分配:

  1. 具体案例
  2. 特定学生(包括该学生的所有案例)
  3. 一所特定的学校(包括该学校的所有学生,以及该学校学生的所有案例)
  4. 一个特定的地区(包括该地区的所有学校,所有在该地区的学校就读的学生,以及在该地区内就读这些学校的所有学生的情况)
  5. 用户(管理员除外)只能查看/编辑/删除已被授予权限的模型。管理员将拥有所有模型的前任权限以及添加新模型。管理员最终会"分配"谁可以访问什么,组似乎是扩展这些功能的自然方式。

    我知道django没有为实例级权限提供本机支持,因此我已经探索了django-guardian包。它似乎提供了特定实例所需的功能,虽然我可以通过shell单独为对象创建权限,但我显然希望在模型中构建此功能。

    理想情况下,在创建模型时,可以使用组(或权限?)来放置用户,例如

    District | District1 | can view District1 
    District | District1 | can edit District1
    District | District1 | can delete District1
    ....
    School | School1 | can view School1 
    School | School1 | can edit School1
    School | School1 | can delete School1
    

    我认为以编程方式为每个对象创建群组权限是理想的吗?但是,如果模型被删除,那么我需要删除这些组?我也觉得组可能会使系统过于复杂,而是依赖于以编程方式生成的权限并完全避免群组?我真的在寻找一个方向,因为我从来不需要创建这样一个唯一的权限方案。非常感谢任何和所有的建议。

0 个答案:

没有答案
相关问题