python – Django规则对象权限

我正在尝试使用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)

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

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

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

最佳答案
正如django-rules documentation所述:

Django Admin does not support object-permissions,in the sense that it will never ask for permission to perform an action on an object,only whether a user is allowed to act on (any) instances of a model.

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

相关文章

Python中的函数(二) 在上一篇文章中提到了Python中函数的定...
Python中的字符串 可能大多数人在学习C语言的时候,最先接触...
Python 面向对象编程(一) 虽然Python是解释性语言,但是它...
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定...
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非...
在windows下如何快速搭建web.py开发框架 用Python进行web开发...