← Назад ко всем вопросам

Как сделать кастомную авторизацию в Django

1️⃣ Как кратко ответить

Для создания кастомной авторизации в Django, необходимо определить собственную модель пользователя, унаследовав её от AbstractBaseUser или AbstractUser. Затем, нужно настроить менеджер пользователей и обновить настройки аутентификации в settings.py. Это позволяет гибко управлять полями и поведением пользователя, адаптируя их под специфические требования проекта.

2️⃣ Подробное объяснение темы

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

Зачем это нужно?

Кастомная авторизация позволяет:

  • Добавлять дополнительные поля в модель пользователя (например, дату рождения, аватар).
  • Изменять логику аутентификации (например, использовать email вместо имени пользователя).
  • Интегрировать сторонние системы аутентификации.

Как это работает?

Шаг 1: Создание кастомной модели пользователя

Для начала, создадим свою модель пользователя. Мы можем унаследовать её от AbstractBaseUser для полной кастомизации или от AbstractUser, если хотим добавить только несколько полей.

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
​
class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('The Email field must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user
​
    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
​
        return self.create_user(email, password, **extra_fields)
​
class CustomUser(AbstractBaseUser):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
​
    objects = CustomUserManager()
​
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']
​
    def __str__(self):
        return self.email

Шаг 2: Настройка settings.py

После создания модели, нужно указать Django использовать её вместо стандартной модели пользователя. Для этого в settings.py добавляем:

AUTH_USER_MODEL = 'myapp.CustomUser'

Шаг 3: Обновление форм и админки

Если вы используете Django Admin, нужно зарегистрировать новую модель пользователя:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser
​
class CustomUserAdmin(UserAdmin):
    model = CustomUser
    list_display = ['email', 'first_name', 'last_name', 'is_staff']
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal info', {'fields': ('first_name', 'last_name')}),
        ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'first_name', 'last_name', 'password1', 'password2'),
        }),
    )
    ordering = ('email',)
​
admin.site.register(CustomUser, CustomUserAdmin)

Шаг 4: Миграции

Не забудьте создать и применить миграции для новой модели:

python manage.py makemigrations
python manage.py migrate

Применение

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

Тема: Django
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки