django-object-permissions vs django-guardian Vs django-authority

django-object-permissions Vs django-guardian Vs django-authority

我发现了Django 1.2+的3个行级权限解决方案

  • django-object-permissions
  • django-guardian
  • django-authority

有人可以说是否比别人推荐的有什么,他们的主要区别是什么?


首先,我们说我们不使用这些对象级别的权限-我们使用自己的自定义方法,我真希望我们没有。如果您完全可以避免对象级别的权限,那么这样做就很麻烦。

这就是我评估您提到的3个应用程序的方式。

积极发展:

  • django-guardian(1周前)
  • django-object-permissions(1年之前)
  • django-authority(接近2年前)
  • API

  • django-guardian(保存已定义模型的实例)
  • django-object-permissions(注册权限)
  • django-authority(定义类)
  • 以上顺便说一句。

    我只建议仅在API上使用监护人,但事实上它仍在开发中,而其他地方通常并不意味着大赢家。


    至于13年8月,
    django-object-permissions已被django-permission取代。
    这三个项目正在积极开发中。

    就个人而言,我更喜欢使用权限检查权限(运行时)的方法的权限或权限,而不是使用数据库保留权限的django-guardian(附加于对象创建,例如)。

    -编辑-

    文档中的示例。

    django-guardian

    1
    2
    3
    4
    5
    6
    7
    joe = User.objects.create(username='joe')
    task = Task.objects.create(summary='Some job', content='', reported_by=boss)
    joe.has_perm('view_task', task)
    >> False
    assign_perm('view_task', joe, task)
    joe.has_perm('view_task', task)
    >> True

    您分配权限并将其保留在数据库中。

    django-authority

    宣言:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class FlatpagePermission(permissions.BasePermission):
        label = 'flatpage_permission'
        checks = ('morning_flatpage_check',)

        def morning_flatpage_check(self, flatpage):
            hour = int(datetime.datetime.now().strftime("%H"))
            if hour >= 8 and hour <= 12 and flatpage.url == '/about/':
                return True
            return False

    authority.register(Flatpage, FlatpagePermission)

    用法:

    1
    2
    3
    4
    5
    def my_view(request):
        check = FlatPagePermission(request.user)
        flatpage_object = Flatpage.objects.get(url='/homepage/')
        if check.morning_flatpage_check(flatpage=flatpage_object):
            print"Yay, you can change *this* flatpage!"

    它还包装了标准的django权限,但是您可以在上面的自定义权限中看到灵活性,这是您在监护人中无法做到的-AFAIK-。

    常见用例

    一个学生可以属于教室。

    监护人:

  • 将学生分配到新的教室后,将权限'attend_classroom'附加到"学生"上的"教室"对象。
  • 将学生从"类"中删除后,请删除"类"对象对"学生"的'attend_classroom'权限。
  • 访问"类"时,请检查'attend_classroom'权限。
  • 权威:

  • 定义自定义权限ClassroomPermission.can_attend_classroom(),它将查询Student是否属于"类"。
  • 访问教室时,请检查ClassroomPermission.can_attend_classroom()
  • 授权将检查逻辑保存在单独的文件中。 Guardian需要其余代码的附加/分离权限。