Пользователи и доступ
Chassis поставляет модуль пользователей, который расширяет стандартный Django Admin: Users, Groups, административные сессии, ограничения попыток входа, профиль администратора, личная смена пароля, определение страны по GeoIP и журнал действий Admin.
В модуле нет продуктовых ролей, MFA и OIDC. Они остаются в приложении.
Глобальное отключение
Добавлено в 1.0.7Проект с собственным users runtime может глобально отключить автоматизацию Chassis:
CHASSIS_USERS_MODULE_ENABLED = False
Настройка отключает автоматическую регистрацию users Admin и страниц, синхронизацию UserProfile, записи middleware реестра сессий и аудита, а также ограничения попыток входа. Модели и миграции Chassis остаются доступными, поэтому таблицы в базе всё равно создаются. Для явной конфигурации также удалите из проекта два users middleware.
Что включает site
При include_users_module = True (значение по умолчанию)
ChassisAdminSiteMixin:
- регистрирует Chassis
UserAdmin/GroupAdminдляAUTH_USER_MODELиGroup - регистрирует
UserSession,LoginAttempt,LoginAttemptSchedule,AdminAuditLog - добавляет личные страницы Профиль и Изменить пароль
- добавляет отдельное действие и страницу Создать пользователя в списке
- добавляет те же пункты в меню пользователя
- вставляет в начало sidebar раздел Пользователи и группы
- ставит
ChassisAdminAuthenticationForm, еслиlogin_formне задан - показывает суперпользователю alert GeoIP, если Country-база недоступна
Отключить модуль на пустом тестовом site:
class CustomAdminSite(ChassisAdminSiteMixin, AdminSite):
include_users_module = False
Глобальная настройка CHASSIS_USERS_MODULE_ENABLED имеет приоритет над этим
флагом конкретного site.
Оставить админки и страницы, но описать sidebar самостоятельно:
class CustomAdminSite(ChassisAdminSiteMixin, AdminSite):
include_users_sidebar = False
sidebar_items = (
# свои разделы, включая auth.user / auth.group при необходимости
)
Создание и изменение пользователей
Изменено в 1.0.4Создание пользователя следует CPA-флоу вместо стандартной add-формы Django.
Стандартная кнопка добавления и прямой add URL отключены. Действие Создать
пользователя открывает единую страницу Chassis с логином, паролем и
подтверждением, необязательными именем, фамилией и email, флагами доступа и
группами. Отсутствие групп не блокирует создание. Страница требует view,
add и change для AUTH_USER_MODEL, право
django_chassis.manage_user_access, а также собственное право
django_chassis.view_user_creation. Активный staff-суперпользователь, как
обычно, обходит эти проверки.
UserCreationAdminPage подключается автоматически, пока включён модуль
пользователей. После успешной проверки пользователь создаётся атомарно,
записывается стандартный Django Admin addition log и открывается карточка
нового пользователя.
Форма изменения использует тот же CPA-контракт: секции учётной записи,
персональных данных, доступа и важных дат. Пароль и прямые user_permissions
не выводятся. Группы назначаются через горизонтальный filtered selector
Django. В форме создания user_permissions также отсутствуют, поэтому доступ
несуперпользователя по умолчанию выдаётся через группы.
Право django_chassis.manage_user_access управляет полями is_active,
is_staff и groups для несуперпользователя. Оно не разрешает оператору
изменять собственный доступ, доступ суперпользователя или is_superuser: эти
операции остаются доступны только суперпользователю.
Sidebar
Стандартный раздел — это привычный список «Пользователи и группы» плюс модели доступа Chassis. Продуктовые роли сюда не попадают:
auth.Userauth.Groupdjango_chassis.UserSessiondjango_chassis.LoginAttemptScheduledjango_chassis.LoginAttemptdjango_chassis.AdminAuditLog
Переопределите get_users_sidebar_section(), если нужны другие подписи или
порядок.
Список сессий по умолчанию показывает активные сессии и предоставляет явные состояния Неактивные и Все. Действие завершения доступно только для активной чужой сессии при наличии соответствующего разрешения администратора.
Изменено в 1.0.4Встроенные списки сессий и аудита Admin выводят записи полноценными таблицами, а не единственной склеенной текстовой колонкой. В строках сессий видны пользователь, клиент, устройство, активность, срок действия и состояние; в строках аудита — администратор, действие, результат, запрос, ответ, IP и браузер. Связанные пользователи загружаются одним запросом со списком.
Права групп
Изменено в 1.0.4Selector прав группы скрывает permissions, у которых имя модели content type
начинается с historical. Так технические модели Historical*, создаваемые
django-simple-history, не попадают в стандартный флоу настройки доступа.
Задайте SIMPLE_HISTORY_HIDE_HISTORY_MODEL_PERMISSIONS = False, чтобы снова
показывать эти права.
Middleware
Подключите реестр сессий и журнал Admin после аутентификации:
MIDDLEWARE = [
# ...
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django_chassis.middlewares.UserSessionMiddleware',
'django_chassis.middlewares.AdminAuditMiddleware',
]
Сессии и журнал Admin пишут IP клиента через netaddr, браузер и ОС — через
device-detector (User-Agent и Chromium Client Hints).
Оба middleware слушают CHASSIS_ADMIN_PATH_PREFIX (по умолчанию /admin/).
UserSessionMiddleware регистрирует текущую staff-сессию, обновляет last-seen
не чаще раза в минуту и разлогинивает пользователя, если запись отозвана или
истекла.
Таблицы базы данных
Изменено в 1.0.1Модуль пользователей хранит данные в chassis_user_profiles,
chassis_user_sessions, chassis_login_attempt_schedules,
chassis_login_attempts и chassis_admin_audit_logs.
Настройки
| Настройка | По умолчанию | Назначение |
|---|---|---|
CHASSIS_USERS_MODULE_ENABLED | True | Глобально включить автоматический users runtime |
CHASSIS_LOGIN_ATTEMPT_LIMITS_ENABLED | True | Применять задержки LoginAttemptSchedule |
CHASSIS_ADMIN_PATH_PREFIX | '/admin/' | Префикс пути для middleware сессий и аудита |
GEOIP_COUNTRY_DATABASE_PATH | не задан | Абсолютный путь к GeoLite2 Country .mmdb |
SIMPLE_HISTORY_HIDE_HISTORY_MODEL_PERMISSIONS | True | Скрывать права моделей Historical* в формах групп |
Пустое расписание попыток входа означает отсутствие задержек. Строки
настраиваются в Admin (у первой позиции delay_seconds=0).
GeoIP
Изменено в 1.0.1geoip2 входит в пакет. Укажите файл MaxMind Country:
GEOIP_COUNTRY_DATABASE_PATH = '/var/lib/geoip/GeoLite2-Country.mmdb'
Если путь или файл отсутствуют, код страны остаётся пустым. Доверенные
proxy-заголовки (CF-IPCountry, X-Country-Code, X-Geo-Country) читаются
только при доступной базе.
Профиль и пароль
AdminProfileAdminPage — это PersonalAdminPage: текущий сотрудник видит
учётную запись, группы, последний вход/IP/страну, текущую сессию и ленту
своих записей журнала Admin. Блоков MFA и продуктовых ролей нет.
SelfPasswordChangeAdminPage использует Django PasswordChangeForm (нужен
старый пароль) и затем завершает сессию.
См. также
Пользовательские поверхности авторизации
Добавлено в 1.0.20AuthenticationSurface подключает ограничения попыток, GeoIP, UserProfile и
UserSession Chassis к собственным шаблонам и активным nonstaff Django User.
Стандартный вход Admin сохраняет обязательную проверку staff.
Каждый view находится в отдельном модуле: SurfaceLoginView — в
django_chassis.views.surface_login, SurfaceLogoutView — в
django_chassis.views.surface_logout, SurfacePasswordChangeView — в
django_chassis.views.surface_password_change. Построитель URL находится в
django_chassis.views.authentication_surface_urls. Все четыре также экспортируются
из django_chassis.views.
from django_chassis.dto.authentication_surface import AuthenticationSurface
from django_chassis.views.authentication_surface_urls import authentication_surface_urls
surface = AuthenticationSurface(
name='operators',
login_url='/login/',
success_url='/workplace/',
login_template='operators/login.html',
password_template='operators/password.html',
url_prefixes=('/workplace/', '/profile/'),
staff_required=False,
lifetime_minutes=720,
expire_on_browser_close=True
)
urlpatterns = authentication_surface_urls(surface=surface)
CHASSIS_AUTHENTICATION_SURFACES = [surface]
Middleware django_chassis.middlewares.authentication_surface.AuthenticationSurfaceMiddleware
устанавливается после Django authentication middleware и Chassis UserSessionMiddleware.
lifetime_minutes и expire_on_browser_close принимают callable без аргументов:
настройки вычисляются при входе, обращения к БД при импорте не нужны.
URLs: login, logout только POST, profile/password. CSRF проверяет Django;
next ограничен безопасным host. Сервисы профиля и сессий доступны независимо
от административного отображения.
Абсолютный deadline сохраняется в metadata общей Django-сессии и не продлевается запросами. Истечение ограничивает только custom surface, сохраняя существующий реестр/backend Admin. Первый вход через custom surface использует её cookie policy; при переходе из зарегистрированной Admin-сессии её cookie policy сохраняется. Смена пароля заменяет текущий ключ и отзывает остальные сессии входа. Браузер может восстановить cookie после закрытия; серверный deadline обеспечивает надёжное ограничение срока.
WebSocket consumers вызывают AuthenticationSurfaceService.is_expired и проверяют
active User плюс UserSession при heartbeat. HTTP middleware не отзывает уже открытый
socket. Проверки владельца и доменных прав остаются в приложении.
chassis_page_classes принимает Sequence[type[AdminPage]], включая списки. Существующее значение по умолчанию сохраняет совместимость.
Необязательные profile_provider, theme_context и audit_sink отделяют DTO, оформление и безопасный аудит auth-событий от шаблонов Admin. Providers получают active User/request; audit sink получает request и событие (login, logout, password_change) без пароля. AuthenticationSurfaceService.get_deadline возвращает абсолютный срок custom surface для UI; он отличается от срока общей backend cookie.