【问题标题】:Django rules object permissionsDjango 规则对象权限
【发布时间】:2019-02-26 13:23:17
【问题描述】:

我正在尝试使用django rules 在 django 和 django 管理界面中配置对象权限。

现在,当我添加权限规则时,它们将始终只使用第一个参数调用,但对象始终为 None。

例如,如果我要创建这个谓词:

@rules.predicate
def is_book_author(user, book):
    return book.author == user

然后将其添加到django权限集中:

rules.add_perm('books.view_book', is_book_author)

现在,当我使用用户登录管理界面时,将使用用户调用 is_book_author,并且没有。它将被多次调用(每个对象一次),但对象始终为 None。

我在 django 2.1.1 和 python 3.7 中使用规则 2.0.0。

如果我做错了什么或如何配置 django 以使用单个对象调用谓词有什么想法吗?

【问题讨论】:

  • 好吧,当时这本书还不存在。 add_book 是添加图书的权限,而不是“保存”图书的权限。我认为你应该在表单中处理这个问题(或者甚至在表单中只是“注入”用户,这样他/她就可以简单地从不添加其他数据)。
  • 感谢您的评论,但我对所有 4 个权限都有问题。我用 view_book 权限替换了问题中的 add_book 以进行澄清。
  • @BluE 我正在尝试解决您的问题,但一切对我来说都很好。我使用 testapp 对其进行了调试,但仍然无法重现您的问题。您能否提供将ObjectPermissionsModelAdminadd_perm 与谓词一起使用的整个文件?还可以查看github.com/dfunckt/django-rules/blob/v2.0.0/tests/testapp/… 尝试将您的代码与 repo 中的代码进行比较。
  • @KamilNiski 我将在今天下班后更新问题以添加所需的信息。快速提问:当您尝试该示例时,您使用的是相同的 django 版本吗?
  • 是的,我使用的库版本与您指定的完全相同

标签: python django permissions rules


【解决方案1】:

正如django-rules documentation 所说:

Django Admin 不支持对象权限,从某种意义上说,它永远不会请求对对象执行操作的权限,只要求用户是否被允许对(任何)实例进行操作一个模型。

如果您想告诉 Django 用户是否对特定对象具有权限,则必须覆盖模型的 ModelAdmin 的以下方法:

has_view_permission(user, obj=None)
has_change_permission(user, obj=None)
has_delete_permission(user, obj=None)

rules 带有一个自定义的ModelAdmin 子类rules.contrib.admin.ObjectPermissionsModelAdmin,它覆盖这些方法以将编辑后的模型实例传递给授权后端,从而在管理中启用每个对象的权限:

# books/admin.py
from django.contrib import admin
from rules.contrib.admin import ObjectPermissionsModelAdmin
from .models import Book

class BookAdmin(ObjectPermissionsModelAdmin):
    pass

admin.site.register(Book, BookAdmin)

现在这允许您像这样指定权限:

rules.add_perm('books', rules.always_allow)
rules.add_perm('books.add_book', has_author_profile)
rules.add_perm('books.change_book', is_book_author_or_editor)
rules.add_perm('books.delete_book', is_book_author)

为了保持向后兼容性,Django 将要求查看或更改权限。为了获得最大的灵活性,规则的行为略有不同:当且仅当不存在查看权限的规则时,规则才会请求更改权限。

【讨论】:

  • 我已经使用了 ObjectPermissionsModelAdmin,但如前所述,传递的对象始终为 None。 (否则根本不会调用谓词)
  • 请将您的设置与 django-rules repo github.com/dfunckt/django-rules/blob/master/tests/testapp/… 中的 testapp 进行比较我正在检查使用谓词的测试,我可以看到 book 正确通过
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2019-12-24
相关资源
最近更新 更多