Комментарии (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
- Пользователь отправляет username + password
authenticate()вызывает backends по очереди- Если backend найдёт пользователя и пароль верный — возвращает User
login()сохраняет данные в сессию- Браузер получает sessionid в cookies
- При следующем запросе Django загружает пользователя из сессии
request.userсодержит текущего пользователя
Эта система обеспечивает безопасность, гибкость и простоту использования в повседневных задачах.