Django规则对象权限

时间:2018-09-22 09:49:11

标签: python django permissions rules

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

现在,当我添加权限规则时,它们将始终仅在第一个参数中被调用,但是对象始终是“无”。

例如,如果我要创建此谓词:

@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将与该用户一起被调用,并且无。它将被多次调用(每个对象一次),但是对象始终为无。

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

有什么想法,如果我做错了什么,或者如何配置django来调用带有单个对象的谓词?

1 个答案:

答案 0 :(得分:3)

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)
     

规则附带一个自定义的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将要求查看或更改权限。为了获得最大的灵活性,规则的行为会有所不同:只有并且仅当不存在用于视图许可的规则时,规则才会请求更改许可。