繁体   English   中英

Django规则对象权限

[英]Django rules object permissions

我正在尝试使用django规则来配置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)

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

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

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

正如django-rules 文档所述:

Django Admin 不支持对象权限 ,因为它永远不会要求对对象执行操作的权限,只允许用户是否允许对模型的(任何)实例进行操作。

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

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

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

 # 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将要求查看或更改权限。 为了获得最大的灵活性,规则的行为略有不同:当且仅当视图权限不存在规则时,规则才会要求更改权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM