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

Как работает система аутентификации в Django?

2.2 Middle🔥 251 комментариев
#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Система аутентификации в Django

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

1. Основные компоненты

User модель — ядро системы:

from django.contrib.auth.models import User

# Создание пользователя
user = User.objects.create_user(
    username="john_doe",
    email="john@example.com",
    password="secure_password123"
)

# Пароль автоматически хешируется
# Не храним пароль в открытом виде!

2. Проверка пароля и вход

from django.contrib.auth import authenticate, login
from django.http import HttpResponse

def login_view(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    
    # Проверяем учетные данные
    user = authenticate(request, username=username, password=password)
    
    if user is not None:
        # Создаёт сессию
        login(request, user)
        return HttpResponse("Успешный вход")
    else:
        return HttpResponse("Неверные учетные данные")

3. Проверка пароля

Пароли хешируются с помощью PBKDF2 (по умолчанию):

# При создании
user.set_password("new_password")
user.save()

# Проверка пароля
if user.check_password("test_password"):
    print("Пароль верный")
else:
    print("Пароль неверный")

4. Работа с сессиями

После login() Django создаёт сессию:

# Доступ к текущему пользователю в представлении
def dashboard(request):
    if request.user.is_authenticated:
        return HttpResponse(f"Привет, {request.user.username}!")
    else:
        return HttpResponse("Требуется вход")

# Выход из системы
from django.contrib.auth import logout

def logout_view(request):
    logout(request)
    return HttpResponse("Вы вышли из системы")

5. Декоратор @login_required

Защита представлений от неавторизованного доступа:

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect

@login_required(login_url='login')  # редирект на страницу входа
def profile(request):
    return HttpResponse(f"Профиль пользователя {request.user.username}")

Для класс-представлений:

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import View

class ProfileView(LoginRequiredMixin, View):
    login_url = 'login'
    
    def get(self, request):
        return HttpResponse(f"Профиль: {request.user.username}")

6. Разрешения (Permissions)

Данные о разрешениях хранятся в БД:

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

# Проверка разрешения
if request.user.has_perm('app.view_post'):
    print("Пользователь может просматривать посты")

# Добавление разрешения
permission = Permission.objects.get(codename='view_post')
request.user.user_permissions.add(permission)

# Удаление разрешения
request.user.user_permissions.remove(permission)

7. Группы (Groups)

Группируют пользователей для управления разрешениями:

from django.contrib.auth.models import Group

# Создание группы
group = Group.objects.create(name='Модераторы')

# Добавление разрешений группе
view_post_perm = Permission.objects.get(codename='view_post')
group.permissions.add(view_post_perm)

# Добавление пользователя в группу
user.groups.add(group)

# Проверка членства в группе
if user.groups.filter(name='Модераторы').exists():
    print("Пользователь модератор")

8. Декоратор @permission_required

from django.contrib.auth.decorators import permission_required

@permission_required('app.view_post', raise_exception=True)
def admin_panel(request):
    return HttpResponse("Админ-панель")

9. Произвольная аутентификация (Custom Backend)

Для нестандартных методов входа:

from django.contrib.auth.backends import ModelBackend

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(email=username)
        except User.DoesNotExist:
            return None
        
        if user.check_password(password) and self.user_can_authenticate(user):
            return user
        return None

Добавить в settings.py:

AUTHENTICATION_BACKENDS = [
    'myapp.backends.EmailBackend',
    'django.contrib.auth.backends.ModelBackend',
]

10. Хеширование паролей

Джанго использует PBKDF2 по умолчанию:

from django.contrib.auth.hashers import make_password, check_password

# Хеширование
hashed = make_password("password123")

# Проверка
if check_password("password123", hashed):
    print("Пароль совпадает")

11. Token Authentication для API

from django.contrib.auth.models import Token

# Создание токена при регистрации
user = User.objects.create_user(username='john', password='pass')
token, created = Token.objects.get_or_create(user=user)
print(token.key)  # Уникальный токен

# В API запросе клиент отправляет:
# Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbea6f7a19

Поток аутентификации в Django

  1. Пользователь отправляет username + password
  2. authenticate() вызывает backends по очереди
  3. Если backend найдёт пользователя и пароль верный — возвращает User
  4. login() сохраняет данные в сессию
  5. Браузер получает sessionid в cookies
  6. При следующем запросе Django загружает пользователя из сессии
  7. request.user содержит текущего пользователя

Эта система обеспечивает безопасность, гибкость и простоту использования в повседневных задачах.