Django Guardian

django-guardian расширяет систему разрешений Django, добавляя поддержку object-level permissions.

Установка

1# Установка пакета
2pip install django-guardian
1# Или через Poetry
2poetry add django-guardian

Настройка

1# settings.py
2INSTALLED_APPS = [
3    'guardian',
4]
5
6AUTHENTICATION_BACKENDS = [
7    'django.contrib.auth.backends.ModelBackend',
8    'guardian.backends.ObjectPermissionBackend',
9]

Назначение разрешений

 1from guardian.shortcuts import assign_perm, get_perms
 2
 3# Назначить разрешение пользователю на объект
 4assign_perm('change_article', user, article)
 5
 6# Проверить разрешения
 7perms = get_perms(user, article)
 8
 9# В представлениях
10from guardian.decorators import permission_required_or_403
11
12@permission_required_or_403('change_article', (Article, 'id', 'article_id'))
13def edit_article(request, article_id):
14    pass

Проверка разрешений в шаблонах

1{% load guardian_tags %}
2
3{% get_obj_perms request.user for article as "article_perms" %}
4
5{% if "change_article" in article_perms %}
6    <a href="{% url 'edit_article' article.id %}">Редактировать</a>
7{% endif %}

Групповые разрешения

1from guardian.shortcuts import assign_perm
2
3# Назначить разрешение группе
4assign_perm('view_article', editors_group, article)
5
6# Проверить групповые разрешения
7user.has_perm('view_article', article)

FAQ

Q: Как работает с группами?
A: Guardian поддерживает групповые разрешения аналогично пользовательским.

Q: Можно ли использовать с DRF?
A: Да, создай кастомный permission класс для DRF.