628a1d4536
- Модель данных: mchs_units (РЦУ РЧС → ОУМЧС → Г(Р)ОЧС, kind+parent_id), users +8 колонок (unit_id, position, status, lockout, must_change_password, created_by, updated_at), roles/permissions/role_permissions/user_roles (M2M матрица), sessions (server-side, token_hash=sha256(secret)), auth_events, security_settings. - Alembic 007_e1_rbac: схема + сид 4 ролей / 9 прав / матрицы (9/6/3/1) / 10 настроек безопасности; downgrade → upgrade идемпотентен (проверено на pg16-контейнере, сид не дублируется). - auth.py: login с lockout (5 неудач → 15 мин) и auth-журналом; server-side сессии (JWT несёт secret, в БД — sha256-хэш; max_concurrent_sessions); /me с permissions (user_roles → role_permissions, fallback legacy-роль); /change-password (мин. длина из settings, отзыв сессий); /logout. require_permission(code) — атомарные права (fallback legacy-роли). - Обратная совместимость: require_roles не тронут, старые JWT без sid продолжают работать. - Тесты E1 (9): login/logout/lockout/me-права/смена пароля/журнал. SQLite in-memory (StaticPool + компиляторы UUID/JSONB/ARRAY). 202 passed, 5 skipped.
9 lines
784 B
SQL
9 lines
784 B
SQL
-- Верификация 007: таблицы, сид ролей/прав/матрицы
|
|
SELECT 'roles' AS t, count(*) FROM roles
|
|
UNION ALL SELECT 'permissions', count(*) FROM permissions
|
|
UNION ALL SELECT 'role_permissions', count(*) FROM role_permissions
|
|
UNION ALL SELECT 'security_settings', count(*) FROM security_settings
|
|
UNION ALL SELECT 'users_new_cols', count(*) FROM information_schema.columns WHERE table_name='users' AND column_name IN ('unit_id','status','failed_login_count','locked_until','must_change_password','created_by','updated_at','position');
|
|
SELECT r.name, count(rp.permission_id) AS perms FROM roles r LEFT JOIN role_permissions rp ON rp.role_id = r.id GROUP BY r.name ORDER BY r.name;
|
|
SELECT name, kind FROM mchs_units;
|
|
SELECT version_num FROM alembic_version; |