Полное руководство для разработчиков

Если вы уже знакомы с моделью фреймворка аутентификации Django, вы знаете, что Django предоставляет надежную систему управления разрешениями пользователей. Система позволяет назначать права пользователю или группе.

В этом уроке мы рассмотрим следующие ключевые понятия:

  • Как создавать, назначать и проверять разрешения
  • Как применить разрешения к представлениям
  • Как настроить разрешения в соответствии с вашими конкретными потребностями

Концепция аутентификации и авторизации

Аутентификация идентифицирует личность пользователя, а авторизация определяет, что пользователь может делать.

Система аутентификации django определяет пользователей на основе их ролей и разрешений.

  • Суперпользователь — у суперпользователя есть все права; они могут выполнять все грубые операции на сайте администратора django. Они также могут создавать других пользователей.
  • Штатный пользователь может получить доступ к сайту администратора; разрешения настраиваются в соответствии с потребностями приложения.
  • Активный пользователь, активный пользователь, является аутентифицированным пользователем.

Активный пользователь может быть суперпользователем, если у него есть необходимые разрешения суперпользователя и статус is_superuser() установлен на True.

Если вам интересно узнать об аутентификации пользователей, прочитайте это руководство.

Начиная

Начнем с создания нашего проекта Django. Начните с создания и активации виртуальной среды и установки django в виртуальной среде.

python -m venv env
source env/bin/activate
pip install django

Создайте новый проект джанго.

django-admin startproject django_permissions

Создайте приложение django с именем school

cd django_permissions
python manage.py startapp school

В файле school/models.py добавьте модель Course.

from django.db import models

# Create your models here.

class Course(models.Model):
    title = models.CharField(max_length=200,null=False,blank=False)
    description = models.TextField(null=True,blank=True)
    date_created = models.DateTimeField(auto_now_add=True)
    
    
    def __str__(self):
        return self.title

Запустите миграцию, чтобы создать таблицы базы данных auth_user и course.

python manage.py makemigrations
python manage.py migrate

Создать суперпользователя

python manage.py createsuperuser
Username (leave blank to use 'admin'): admin
Email address: 
Password: 
Password (again): 
Superuser created successfully.

Созданный выше суперпользователь имеет все привилегии в админке django. Запустите сервер разработки и войдите на сайт администратора.

python manage.py runserver

Как вы можете видеть выше, у суперпользователя есть все разрешения, доступные на сайте администратора django.

Назначение разрешений группам

Django использует группы для назначения пользовательских разрешений набору пользователей. Например, в нашем приложении могут быть группы учащихся и инструкторов. Учащиеся будут иметь разные разрешения от преподавателей.

Самый простой и рекомендуемый способ назначить разрешения пользователям — создать группу, а затем назначить разрешения группе. Любой пользователь, добавленный в группу, автоматически наследует разрешения группы.

Вернитесь на сайт администратора и нажмите «Добавить» рядом с параметром «Группы». Добавьте новую группу под названием инструкторы со следующими разрешениями:

  • Можно добавить курс
  • Может изменить курс
  • Можно просмотреть курс

Создайте новое имя пользователя janedoe.

Добавьте пользователя janedoe в группу инструкторов с сайта администратора.

Убедитесь, что разрешения изменились.

>>> from django.contrib.auth.models import User,Group
>>> group = Group.objects.get(name ="instructors")
>>> group.permissions.all()
<QuerySet [<Permission: course | Can add course>, <Permission: course | Can change course>, <Permission: course | Can view course>]>
>>> 

Добавить разрешения программно

Мы успешно добавили разрешения для определенной группы на сайте администратора. Затем мы назначили эту группу пользователям, что позволило им просматривать, обновлять и добавлять курсы. Давайте узнаем, как добавлять разрешения программно, не полагаясь на интерфейс сайта администратора.

Добавить разрешения пользователя

Несмотря на то, что добавление разрешений через группы является лучшим вариантом, вам все же может потребоваться добавить настраиваемое разрешение для конкретного пользователя. Давайте создадим нового пользователя, а затем назначим новое разрешение.

from django.contrib.auth.models import User, Permission
from django.contrib.contenttypes.models import ContentType

# create new user
user = User.objects.create(
             username = "janedoe", password = "zRZhAaDpY")

# Get the model contenttype
contenttype = ContentType.objects.get_for_model(Course)

# create permission

review_permision = Permission.objects.create(
    codename = "can_deactivate_courses",
    name ="Can Deactivate courses",
    content_type =contenttype
)
# add permission to user
user.user_permissions.add(permision)

contenttype framework используется django для отслеживания информации и метаданных о моделях. contenttype = Contenttype.objects.get_for_model(Course) извлекает информацию о модели курса

Проверьте, есть ли у пользователя примененное разрешение

>>> from django.contrib.auth.models import User
>>> user =User.objects.get(username ="joedoe")
>>> print(user.has_perm("school.can_deactivate_courses"))
True
>>>

Добавить групповые разрешения

Мы также можем программно добавить разрешения группе, как показано ниже.

from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType

# Get the model contenttype
contenttype = ContentType.objects.get_for_model(Course)

# create permission
review_permision = Permission.objects.create(
    codename = "can_review_courses",
    name ="Can Review courses",
    content_type =contenttype
)

# create group

review_group, created = Group.objects.get_or_create(name='reviewers')

# add permission to group

review_group.permissions.add(review_permision)

Убедитесь, что разрешение на проверку было введено в действие.

>>> from django.contrib.auth.models import Group
>>> reviewers = Group.objects.get(name='reviewers')
>>> print(reviewers.permissions.all())
<QuerySet [<Permission: school | course | Can Deactivate courses>]>
>>> 

Если вам нужно добавить несколько разрешений в группу, добавьте их, как показано ниже.

review_group.permissions.add(permission1, permission2)

Пользовательские разрешения.

По умолчанию любая модель Django имеет доступ к следующим разрешениям:

  • view_model: позволяет пользователям просматривать экземпляр модели
  • add_model: позволяет пользователям создавать новый экземпляр модели
  • change_model: позволяет пользователям изменять существующий экземпляр модели.
  • delete_model: позволяет пользователям удалять экземпляр модели

Эти разрешения добавляются по умолчанию при выполнении миграции. Однако вы можете добавить к своей модели настраиваемые разрешения для удовлетворения конкретных потребностей вашего приложения.

Разрешения в модели Django определяются в метаклассе с кортежем разрешений в формате (кодовое имя, удобочитаемое имя). Давайте назначим пользовательское разрешение, позволяющее пользователю просматривать курс.

class Course(models.Model):
    title = models.CharField(max_length=200,null=True,blank=True)
    description = models.TextField(null=True,blank=True)
    date_created = models.DateTimeField(auto_now_add=True)
    
    
    def __str__(self):
        return self.title
    
    class Meta:
        permissions = [
 
            ("can_review_courses", "Can review courses"),
        ]

Как только вы добавите настраиваемые разрешения, запустите миграцию.

python manage.py makemigrations
python manage.py migrate

Примененные разрешения теперь доступны для использования. Применим разрешение к группе нашего инструктора.

from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType

group = Group.objects.get(name='instructors')

can_view_course = Permission.objects.get(codename='can_review_courses')

group.permissions.add(can_review_courses)

Добавить разрешения для представлений

Django поставляется с декоратором permission_required, который позволяет вам добавлять разрешения для представлений на основе функций.

from django.contrib.auth.decorators import permission_required
from django.http import HttpResponse

@permission_required("school.can_review_courses")
def review_courses(request):
    return HttpResponse("You can review courses")

Если пользователь, прошедший проверку подлинности, попытается получить доступ к представлению review_courses без разрешения review_coursers, django вызовет исключение PermissionDenied и вернет ошибку 403 Forbidden.
Если пользователь, не прошедший проверку подлинности, попытается получить доступ к той же странице, он будет перенаправлен на URL-адрес входа. .

Для представлений на основе классов разрешения применяются с помощью класса PermissionRequiredMixin. Сначала импортируйте класс PermissionRequiredMixin из django.contrib.auth.mixins.

from django.contrib.auth.mixins import PermissionRequiredMixin

Затем добавьте его следующим образом:

from django.contrib.auth.mixins import PermissionRequiredMixin
from django.views.generic.edit import UpdateView

class ReviewCourseView(PermissionRequiredMixin,UpdateView):
    permission_required ="school.can_review_courses"
    def get(self, request):
        # add view logic 
        return HttpResponse("You can review Courses")

Примечание. Суперпользователь будет иметь все типы разрешений, даже настраиваемые разрешения, которые мы только что создали.

>>> from django.contrib.auth.models import User
>>> user =User.objects.get(username ="admin")
>>> print(user.has_perm("school.can_deactivate_courses"))
True
>>>

Заключение

В этом руководстве рассказывается, как создавать группы и добавлять пользователей в группы. Мы также создали настраиваемые разрешения и рассказали о добавлении разрешений для функций и представлений на основе классов. Теперь вы можете обеспечить доступ в своем приложении Django.

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .