Обновления в accounts: модели, представления, миграции и новый бэкенд

This commit is contained in:
2026-01-08 22:09:38 +03:00
parent dbf00dab29
commit 796fd8fe18
4 changed files with 139 additions and 15 deletions

View File

@@ -11,30 +11,51 @@ from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth.decorators import login_required
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.forms import PasswordChangeForm
from django.db import connection
from .forms import PasswordResetForm
from .models import CustomUser
import uuid
def login_view(request):
"""
Страница входа для пользователей тенанта (CustomUser).
SECURITY: Работает ТОЛЬКО на tenant доменах!
На public домене перенаправляет на страницу логина PlatformAdmin.
"""
# Проверяем что мы НЕ на public домене
schema_name = getattr(connection, 'schema_name', 'public')
if schema_name == 'public':
messages.info(
request,
'Вход для пользователей магазинов доступен только на домене вашего магазина. '
'Если вы администратор платформы, используйте /platform/login/'
)
return redirect('platform_admin:login')
if request.method == 'POST':
email = request.POST.get('email')
password = request.POST.get('password')
# Используем email как логин
user = authenticate(request, username=email, password=password)
if user is not None:
if user.is_email_confirmed: # Проверяем, подтвержден ли email
login(request, user)
# Проверяем, что это CustomUser (пользователь магазина), а не PlatformAdmin
if not isinstance(user, CustomUser):
# Не раскрываем информацию о существовании других типов пользователей
messages.error(request, 'Пользователь не найден.')
elif not user.is_email_confirmed:
messages.error(request, 'Пожалуйста, подтвердите ваш email для входа.')
else:
login(request, user, backend='accounts.backends.TenantUserBackend')
# Перенаправляем на главную страницу после успешного входа
next_page = request.GET.get('next', 'index') # Если есть параметр next, переходим туда
return redirect(next_page)
else:
messages.error(request, 'Пожалуйста, подтвердите ваш email для входа.')
else:
messages.error(request, 'Неверный email или пароль.')
return render(request, 'login.html')
@@ -203,9 +224,9 @@ def password_setup_confirm(request, token):
registration.password_setup_token_created_at = None
registration.save()
# Автоматический вход
# Автоматический вход (используем TenantUserBackend)
connection.set_tenant(tenant)
login(request, owner, backend='django.contrib.auth.backends.ModelBackend')
login(request, owner, backend='accounts.backends.TenantUserBackend')
messages.success(
request,