Перейти к основному содержимому

Пользователи и доступ

Добавлено в 1.0.1

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-суперпользователь, как обычно, обходит эти проверки.

Добавлено в 1.0.4

UserCreationAdminPage подключается автоматически, пока включён модуль пользователей. После успешной проверки пользователь создаётся атомарно, записывается стандартный Django Admin addition log и открывается карточка нового пользователя.

Форма изменения использует тот же CPA-контракт: секции учётной записи, персональных данных, доступа и важных дат. Пароль и прямые user_permissions не выводятся. Группы назначаются через горизонтальный filtered selector Django. В форме создания user_permissions также отсутствуют, поэтому доступ несуперпользователя по умолчанию выдаётся через группы.

Добавлено в 1.0.4

Право django_chassis.manage_user_access управляет полями is_active, is_staff и groups для несуперпользователя. Оно не разрешает оператору изменять собственный доступ, доступ суперпользователя или is_superuser: эти операции остаются доступны только суперпользователю.

Стандартный раздел — это привычный список «Пользователи и группы» плюс модели доступа Chassis. Продуктовые роли сюда не попадают:

  • auth.User
  • auth.Group
  • django_chassis.UserSession
  • django_chassis.LoginAttemptSchedule
  • django_chassis.LoginAttempt
  • django_chassis.AdminAuditLog

Переопределите get_users_sidebar_section(), если нужны другие подписи или порядок.

Список сессий по умолчанию показывает активные сессии и предоставляет явные состояния Неактивные и Все. Действие завершения доступно только для активной чужой сессии при наличии соответствующего разрешения администратора.

Изменено в 1.0.4

Встроенные списки сессий и аудита Admin выводят записи полноценными таблицами, а не единственной склеенной текстовой колонкой. В строках сессий видны пользователь, клиент, устройство, активность, срок действия и состояние; в строках аудита — администратор, действие, результат, запрос, ответ, IP и браузер. Связанные пользователи загружаются одним запросом со списком.

Права групп​

Изменено в 1.0.4

Selector прав группы скрывает permissions, у которых имя модели content type начинается с historical. Так технические модели Historical*, создаваемые django-simple-history, не попадают в стандартный флоу настройки доступа.

Добавлено в 1.0.4

Задайте 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_ENABLEDTrueГлобально включить автоматический users runtime
CHASSIS_LOGIN_ATTEMPT_LIMITS_ENABLEDTrueПрименять задержки LoginAttemptSchedule
CHASSIS_ADMIN_PATH_PREFIX'/admin/'Префикс пути для middleware сессий и аудита
GEOIP_COUNTRY_DATABASE_PATHне заданАбсолютный путь к GeoLite2 Country .mmdb
SIMPLE_HISTORY_HIDE_HISTORY_MODEL_PERMISSIONSTrueСкрывать права моделей Historical* в формах групп

Пустое расписание попыток входа означает отсутствие задержек. Строки настраиваются в Admin (у первой позиции delay_seconds=0).

GeoIP​

Изменено в 1.0.1

geoip2 входит в пакет. Укажите файл 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.20

AuthenticationSurface подключает ограничения попыток, 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. Проверки владельца и доменных прав остаются в приложении.

Изменено в 1.0.20

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.