【问题标题】:django-object-permissions Vs django-guardian Vs django-authoritydjango-object-permissions Vs django-guardian Vs django-authority
【发布时间】:2012-06-20 09:44:44
【问题描述】:

我找到了 3 个适用于 Django 1.2+ 的行级权限解决方案

有人能告诉我是否有比其他人更多的推荐,他们的主要区别是什么等?

【问题讨论】:

标签: django django-authentication django-apps django-permissions


【解决方案1】:

我将首先说我们不使用这些来获得对象级别的权限 - 我们使用我们自己的自定义方法,我真的希望我们没有。如果您可以完全避免对象级别的权限,那就这样做吧,他们很难组织起来。

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

积极发展:

  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,但事实上它仍在开发中,而其他人通常不会这样做,这意味着一个巨大的胜利。

【讨论】:

  • 你会考虑在 2019 年重新调整这个吗?
  • @Mr-Programs,请随时编辑我的答案!如果你想改变它,我会审查。
【解决方案2】:

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

就个人而言,我更喜欢权限或权限,它使用 methods 来检查权限(运行时),而不是 django-guardian 使用 database 来保持权限(附加在对象创建,fe)。

-- 编辑--

文档中的示例。

django 守护者

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-权威

声明:

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 中无法做到的灵活性。

常见用例

学生可以属于教室。

监护人

  1. 当学生被分配到新教室时,将权限'attend_classroom' 附加到学生超过教室对象。
  2. 当学生从课堂中移除时,移除'attend_classroom' 对课堂对象的学生权限。
  3. 访问“课堂”时,请检查'attend_classroom' 权限。

权威

  1. 定义自定义权限ClassroomPermission.can_attend_classroom(),查询Student是否属于Classroom。
  2. 访问课堂时,请检查ClassroomPermission.can_attend_classroom()

Authority 将检查逻辑保存在单独的文件中。 Guardian 需要通过其余代码附加/分离权限。

【讨论】:

  • 我不太明白你所说的运行时与对象创建是什么意思。大概他们都使用数据库来存储权限,并且都使用 API 来检索它们。
  • @RobertGrant:为了清楚起见,我添加了几个示例。
  • 好吧,我想你是说权威的工作方式是你为对象类型和权限类型的每个组合定义一个自定义方法,在那里你编写代码来检查某人是否有权限,而在《卫报》中你说user.has_perm('classroom.attend_classroom')?
  • 这里的建议今天仍然适用吗? Authority 看起来非常接近我想要的,基于类别的安全选民,但一年多没有活动……还有其他选择吗?
  • django-permission 看起来不错,我想我要给它一个检查权限,看看我是否可以忽略 db 权限并使用基于自定义类的东西
猜你喜欢
  • 2013-04-26
  • 2012-05-12
  • 2014-01-13
  • 2011-07-14
  • 2011-02-11
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多