Разрешение на уровне объекта Django с использованием автоматически создаваемых разрешений модели по умолчанию

По умолчанию, Django добавляет 4 разрешения для каждой зарегистрированной модели:

  • add_model_name
  • change_model_name
  • delete_modelname
  • view_modelname

Когда пользователь имеет одно из этих разрешений, оно применяется ко всем экземплярам этой модели. Это не то, что я хочу, я хочу разрешения для каждого экземпляра.

Когда создатель (created_by в базе данных, или какой-то связанной таблице пользователей с доступом) имеет delete_modelname разрешение, он может удалить только этот экземпляр, а не какой-то другой, созданный другим пользователем.

Я просмотрел другие ответы, и ни в одном из них не упоминаются автоматически создаваемые разрешения CRUD, которые создаются для всех моделей, в основном это новые таблицы или сторонние библиотеки.

Как насчет предоставления создателям моделей таких прав (добавление, изменение, удаление, просмотр), которые обычно дают им доступ ко всем другим моделям, но при этом иметь пользовательский бэкенд auth, который проверяет объект:

from django.contrib.auth.backends import BaseBackend

class ObjectPermissionBackend(BaseBackend):
    def has_perm(self, user_obj, perm, obj=None):
        if not obj:
            return False
        return obj.created_by == user_obj.pk # or something like this

А затем использовать его:

AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend', 'path.to.ObjectPermissionBackend']

Есть ли у этого какая-то обратная сторона?

Вернуться на верх