Джанго управляет разрешениями на объекты - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь использовать правила 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)

Теперь, когда я вхожу в интерфейс администратора с пользователем, is_book_author будет вызываться с пользователем и None.Он будет вызываться несколько раз (по одному разу для каждого объекта), но объект не всегда None.

Я использую правила 2.0.0 с django 2.1.1 и python 3.7.

Любые идеи, еслиЯ делаю что-то не так или как настроить django для вызова предиката с отдельным объектом?

1 Ответ

0 голосов
/ 07 октября 2018

Как 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 запросит любое представлениеили изменить разрешение.Для максимальной гибкости правила ведут себя немного иначе: правила будут запрашивать разрешение на изменение, если и только если не существует правила для разрешения на просмотр.

...