Django-Object-Permissions与Django-Guardian与Django-Authority之间的区别

38

我正在阅读有关Django扩展的内容,发现它们也可以进行自定义权限?我感到困惑,它们真的可以吗?目前在Django中哪种是默认的权限方式?https://django-extensions.readthedocs.io/en/latest/command_signals.html#custom-permissions-for-all-models - Mr-Programs
2个回答

26

首先声明,我们不使用这些工具进行对象级别的权限控制 - 我们使用自定义方法,但真心希望没有这个需求。如果你能够避免使用对象级别的权限控制,请这样做,因为它们很难组织。

以下是我对提到的三个应用程序的评估。

活跃度:

  1. django-guardian (1周前)
  2. django-object-permissions (1年前)
  3. django-authority (将近2年前)

API

  1. django-guardian (保存定义模型的实例)
  2. django-object-permissions (注册权限)
  3. django-authority (定义类)

顺便说一下,以上排名有先后之分。

纯粹从 API 的角度推荐 guardian,而且它仍在开发中,这通常意味着一个重大的胜利。


2
你会考虑为2019年重新调整这个吗? - Mr-Programs
@Mr-Programs,尽管放心地编辑我的回答!如果你想改变它,我会进行审核。 - Josh Smeaton
你介意更新答案吗? - Martin Thoma
@MartinThoma 可以随意对答案进行修改建议。 - Josh Smeaton

21

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

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

-- 编辑 --

文档中的示例。

django-guardian

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

声明:

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)

使用方法:

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- 在 Guardian 中无法实现。

常见用例

一个学生可以属于一个或多个教室。

Guardian:

  1. 当向学生分配新教室时,将 'attend_classroom' 权限附加到学生的教室对象上。
  2. 当从教室中移除学生时,将 'attend_classroom' 权限从学生的教室对象上删除。
  3. 访问教室时,检查 'attend_classroom' 权限。

Authority:

  1. 定义自定义权限 ClassroomPermission.can_attend_classroom(),该权限将查询学生是否属于教室。
  2. 访问教室时,检查 ClassroomPermission.can_attend_classroom()

Authority 将检查逻辑保留在独立的文件中。Guardian 需要通过其余代码进行权限的附加/移除。


我真的不太明白您所说的运行时与对象创建之间的区别。可能它们都使用数据库来存储权限,并且都使用 API 来检索它们。 - Rob Grant
@RobertGrant:我添加了一些例子以增加清晰度。 - laffuste
好的,我认为你的意思是 Authority 的工作方式是为每种对象类型和权限类型定义一个自定义方法,在其中编写代码以检查某人是否具有权限,而在 Guardian 中,你会说 user.has_perm('classroom.attend_classroom') - Rob Grant
1
django-permission 看起来非常不错,我想我会尝试使用它而不是 authority,并看看是否可以忽略数据库权限并使用自定义的基于类的东西。 - Steve
我从 Guardian 迁移到 Authority,因为在我的情况下,维护它容易出错。对于新开发人员来说,理解受保护的视图比在服务类中持久化权限更容易(逻辑分散)。如果适用,请在此问题中分享您的发现 :) - laffuste
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接