В предыдущем шаге мы рассматривали разрешения, которые предоставляются из фреймворка Django. Они входят в пакет django.contrib.auth.
Рассмотрели какие 4 разрешения Django создает для каждой модели по умолчанию.
Рассмотрели как эти разрешения можно задавать определенным пользователям и назначать эти разрешения группам.
Рассмотрели как можно в модели определять другие специфические разрешения и как их создавать программно.
Но все эти разрешения на уровне модели. Что это значит?
Допустим, когда мы создаем модель Post, то Django наряду с другими разрешениями по умолчанию создает разрешение change_post.
И допустим, у нас есть пользователь Василий и мы ему задаем разрешение change_post. И теперь он может изменять все статьи, так как у него есть такое разрешение.
А что если мы хотим дать разрешение на редактирование только определенным статьям (объектам модели Post)?
Допустим есть четыре поста(объекта) и мы хотим дать Василию разрешение на редактирование первой и третьей статьи, а остальные статьи он не может редактировать:
Вот для решения таких задач(управление разрешениями на уровне объектов) мы и будем использовать библиотеку django-guardian.
Продолжим работу в нашем проекте и приложении blog. И установим библиотеку django-guardian:
pip install django-guardian
Подключим django_guardian в наш проект в файле settings.py. Также в этом файле добавим бэкенды для авторизации, которые используются для работы django_guardian:
INSTALLED_APPS = (
#другие приложения
'blog',
'guardian',
)
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend', # Этот бэкенд Django использует по умолчанию
'guardian.backends.ObjectPermissionBackend', # А это бэкенд django_guardian
)
После применения миграций, мы в базе данных увидим две таблицы, которые создал пакет django_guardian:
Теперь мы можем задавать разрешения либо программно, либо через административную панель Django. Давайте реализуем это через административную панель Django и покажем как каждому посту можно указать пользователя , который может редактировать этот пост.
В файле admin.py напишем такой код:
from django.contrib import admin
from blog.models import Post
from guardian.admin import GuardedModelAdmin
class PostAdmin(GuardedModelAdmin):
list_display = ('name',)
admin.site.register(Post, PostAdmin)
Добавляем первый пост и для пользователя мы разрешим его редактирование:
Далее нажимаем в правом верхнем углу кнопку OBJECT PERMISSIONS, затем выбираем пользователя Василий и нажимаем кнопку Manage user:
Как вы видите, для пользователя Василий для объекта первый пост мы задали разрешение Can change post:
Это всё можно сделать и программно. Давайте добавим вторую статью и для пользователя Василия укажем, разрешение change_post:
from django.contrib.auth.models import User
from guardian.models import UserObjectPermission
from blog.models import Post
vasiliy = User.objects.get(username='Василий')
second_post = Post.objects.create(name='Второй пост', content='Этот пост может менять Василий')
UserObjectPermission.objects.assign_perm('change_post', vasiliy, obj=second_post)
Проверим работу:
В данном шаге я постарался показать как можно задавать разрешения отдельным объектам и управлять ими через административную панель или программным способом. С помощью замечательной библиотеки django-guardian это все реализуется очень легко.