Пользователи
Пользователи и роли: роль-шаблон, отдельные права, города, блокировка и пароли.
Список учётных записей открывается в трёх местах, и везде это одна и та же панель:
- «Инструменты» → «Администрирование» → «Пользователи» — отдельное окно «Пользователи и роли»;
- меню пользователя → «Личный кабинет» → вкладка «Пользователи» (вкладка есть у тех, у кого есть право «Управление пользователями»);
- меню пользователя → «Пользователи» — открывает кабинет сразу на этой вкладке. Пункт виден только при включённом входе.
Возможности
- Создать учётную запись: логин, пароль, роль-шаблон и города.
- Сменить роль и города прямо в строке таблицы.
- «Права» — отдельные права поверх роли: матрица «вид объекта × действие» с охватом «нет / свои / все» и общие права (расчёты, выгрузки, журналы, справочники, журнал действий, пользователи, персональные данные).
- Заблокировать и разблокировать, задать новый пароль, удалить.
- Блокировка, смена роли, прав и городов действуют и на уже открытые сессии — без повторного входа.
Как это работает
Где хранятся учётные записи. По умолчанию — таблица users отдельной базы пользователей (UsersDB), общей для
всех городов. Роль хранится в users.role, города — в users.cities (пусто — все города, в том числе
добавленные позже). Пароль хранится только хешем bcrypt.
Роль — шаблон прав. Роль сама по себе ничего не запрещает и не разрешает: она задаёт набор галочек по умолчанию.
| Роль | Объекты сети | Общие права |
|---|---|---|
| Просмотр | ничего | выгрузки |
| Режимщик | свойства потребителей, источников, оборудования и режима узла — все | расчёты, сохранение расчётов, выгрузки |
| Оператор сети | создание — все; свойства, перемещение, удаление — только свои | выгрузки |
| Редактор | свойства, создание, перемещение — все; удаление — только свои | расчёты, сохранение, выгрузки, импорт, журналы, справочники, персональные данные |
| Администратор | всё — все | все, включая журнал действий и пользователей |
Права поверх роли. Окно «Права: логин» показывает действующие права: шаблон роли плюс отличия. Строки матрицы — «Участки», «Узлы», «Потребители», «Источники и насосные станции», «Оборудование», «Режим узла (заданный напор, подпитка)». Столбцы — «Свойства», «Создание», «Перемещение и изломы», «Удаление». У оборудования нет перемещения, у режима узла — только свойства. «Создание» бывает только «нет» или «все»: создавать «только свои» объекты не имеет смысла.
В базе хранятся только отличия от шаблона (users.permissions, JSON). Отличия отмечены точкой, в заголовке —
«отличий от роли: N», в таблице пользователей — «роль + N». «Сбросить к роли» возвращает галочки шаблона.
Если сменить в окне роль-шаблон, галочки тоже сбрасываются к новой роли.
«Свои» объекты — созданные этим пользователем в вебе. Авторство пишется при создании в таблицу
object_authorship базы города. Строка карточки (например, оборудование на участке) считается своей, если свой
её участок или узел. Объекты из десктопа и созданные другими — чужие.
Когда изменения вступают в силу. Сервер проверяет учётную запись при каждом запросе и держит результат
в памяти до 30 секунд (USER_STATUS_TTL). Процесс API, через который администратор сделал правку, забывает
запомненное сразу; другие процессы — не позже чем через 30 секунд. Заблокированный получает «Учётная запись
заблокирована или удалена». У кого убрали текущий город — «Нет доступа к городу «Алматы». Доступ выдаёт
администратор».
Смена пароля администратором закрывает и открытые сессии пользователя в браузере, и его ключи для внешних систем
(API v2, ArcGIS, MCP): при следующем запросе он получит «Пароль изменён — войдите снова». Когда пользователь сам меняет
свой пароль, его текущая вкладка продолжает работу с новым входом, остальные сессии закрываются. Сессии, открытые до
обновления сервера с этой проверкой, действуют до конца срока входа (JWT_EXPIRE_MINUTES, по умолчанию 480 минут).
Что сервер не даёт сделать:
- лишить себя права «Управление пользователями» — сменой роли, блокировкой или снятием галочки в матрице прав: «Нельзя снять с себя роль admin или заблокировать себя»;
- удалить себя — «Нельзя удалить самого себя»;
- лишить этого права последнего активного пользователя, у которого оно есть, если мастер-учётка не настроена: «Это последний активный администратор». Считается действующее право, а не название роли: администратор, у которого право снято в матрице, не в счёт, а редактор, которому оно выдано, — в счёт;
- закрыть себе город, в котором вы работаете;
- создать пользователя с занятым логином (без учёта регистра) или с логином мастер-учётки.
Мастер-учётка — учётная запись владельца вне базы пользователей: логин MASTER_LOGIN, хеш пароля
MASTER_PASSWORD_HASH в настройках сервера. Её нет в таблице; над таблицей плашка «Мастер-учётка «…» — вне
списка: её нельзя удалить или заблокировать, пароль меняется только на сервере». Мастер-учётка — всегда
администратор и видит все города. Сменить её пароль из веба нельзя: «Сменить пароль» отвечает отказом.
После смены хеша на сервере все её сессии закрываются.
Ключи для внешних программ. В «Личном кабинете» каждый пользователь сам выдаёт себе ключи: «ИИ-клиенты (MCP)», «ArcGIS и QGIS (FeatureServer)» и «Ключ API v2 (внешние системы)». Ключ действует с правами пользователя и только на своих адресах. Отдельной таблицы ключей нет, поэтому администратор не видит, кто какие ключи выдал, и не может отозвать один ключ. Ключи закрываются вместе с учётной записью:
| Ключ | Срок по умолчанию | Где действует | Чем закрыть досрочно |
|---|---|---|---|
| API v2 | 365 дней (API_TOKEN_DAYS, до 730) |
/api/v2 |
смена пароля, блокировка, удаление |
| ArcGIS | 90 дней (ARCGIS_TOKEN_DAYS, до 365) |
FeatureServer /api/arcgis/… |
то же |
| MCP | 30 дней (MCP_TOKEN_DAYS, до 90) |
/mcp |
то же |
У пользователя — роли PostgreSQL (AUTH_BACKEND=pg) смена пароля ключи не закрывает — только блокировка.
Выдача ключа пишется в журнал действий (API_KEY, ARCGIS_TOKEN, MCP_TOKEN). Ключи встраивания карты —
другие: их выдаёт администратор, и у них есть список и отзыв (см. Встраиваемые карты).
Что нужно для работы
- Права: «Управление пользователями» (
users_admin). Оно есть у роли «Администратор»; другой роли его можно выдать галочкой. - Сервер: включённый вход (
AUTH_DISABLED=false). Без входа список только читается: сервер отвечает на запись 503 «Управление пользователями доступно только при AUTH_DISABLED=false». - База: UsersDB с колонками
role,cities,permissions(миграции alembic). Без них — «UsersDB недоступна или не обновлена (нужна колонка users.role)».
Шаги
Откройте «Инструменты» и наберите в поиске «Пользователи» — пункт выделен рамкой.

Нажмите пункт — откроется окно.


Примеры
Сотрудник, который ведёт журналы и правит только свои участки. Создайте пользователя с ролью «Просмотр».
В «Правах» поставьте «Участки → Свойства: свои», отметьте «Журналы» и снимите «Выгрузки и отчёты». В заголовке —
«отличий от роли: 3». Так проверено на копиях (almatygid_copy, usersdb_copy): после входа /auth/me вернул
роль «Просмотр», из общих прав — только «Журналы», для участков — «свойства: свои», создание, перемещение
и удаление — «нет». Окно пользователей и журнал действий ему не открылись (403 «Нет права «Управление
пользователями»»), а история правок открылась — она доступна всем.
Закрыть доступ сотруднику, который уволился. Нажмите «Заблокировать». Его вкладка в браузере перестанет работать в течение 30 секунд, ключи API v2, ArcGIS и MCP — тоже. Удалять учётную запись не обязательно: автор правок в истории сохраняется в любом случае.
Если не получается
- Плашка «AUTH_DISABLED=true: изменения пользователей отключены» — вход на сервере выключен, список только читается; нет кнопки «Добавить» и значков в строках.
- Нет кнопки «Добавить» и значков в строках — у вас нет права «Управление пользователями» или вход на сервере выключен.
- «Пользователь «…» уже существует» — логин занят; регистр букв не учитывается.
- «Это последний активный администратор» — сначала назначьте другого администратора.
- Пользователь не может войти: «Нет доступа к городу «…»» — отметьте город в столбце «Города» или очистите список (все города).
Для администратора
- Переменные:
AUTH_DISABLED,AUTH_BACKEND(usersdbилиpg),MASTER_LOGIN(по умолчаниюadmin),MASTER_PASSWORD_HASH(пусто — мастер-учётки нет),USER_STATUS_TTL(30),AUTH_LIVE_USER_CHECK(true),JWT_EXPIRE_MINUTES(480). Мастер-пароль задаёт скрипт на сервере, из веба он не меняется. - Вход через роли PostgreSQL (
AUTH_BACKEND=pg). Пользователь — роль PostgreSQL с теми же логином и паролем, что в десктопе. Таблица меняется: «Права» (предметные права десктопа: сеть, добавление и удаление, акты, геобаза, ПТС, коррозия, ремонты), «Территория» (фрагменты, где разрешена правка), «Веб». Карандаш «Права и территория» открывает ФИО, имя в истории правок, роль, права, фрагменты и доступ к веб-приложению. Пароль, заданный администратором, — временный: при входе пользователь задаёт свой. Удалить такого пользователя нельзя — только заблокировать. Окончательно права проверяет база. - Каждое действие с пользователями пишется дважды: в журнал действий (действие «Управление пользователями»)
и в историю правок базы города (таблица
usersdb.users, операции INSERT, UPDATE, PASSWORD, DELETE — без пароля). Историю правок видит любой вошедший, поэтому список логинов, ролей и городов из неё виден всем.
Для разработчика
- API:
GET /api/v1/admin/roles(роли и модель прав для матрицы),GET|POST /api/v1/admin/users,PATCH /api/v1/admin/users/{id}(role,is_active,cities,permissions; дляpg—caps,fragments,display_name,full_name,web_access),PUT …/{id}/password,DELETE …/{id}—routers/admin.py,database/users_admin.py,database/pg_users.py. Свой пароль —POST /api/v1/auth/password, свои права —GET /api/v1/auth/me(permissions,role_label,is_master,cities). - Модель прав:
permissions.py(KINDS,ACTIONS,GENERAL,ROLE_PRESETS,effective,ensure_targets); в вебе —utils/permissions.ts(ROLE_PRESETSменяются вместе). Живая проверка учётной записи —auth.apply_live_user_status. - Ключи:
POST /api/v1/api-key(routers/api_v2.py),POST /api/v1/arcgis/token(routers/arcgis.py),POST /api/v1/mcp/token(routers/mcp.py). Назначение — claimscope(api,arcgis,mcp), отпечаток пароля — claimpwf;auth.decode_access_tokenпринимает ключ с назначением только там, где его разрешили. - Веб:
components/UsersAdminPanel.vue(общая дляUsersAdminDialog.vueи вкладкиAccountDialog.vue),UserPermissionsDialog.vue, панели ключей —ApiKeyPanel.vue,ArcgisClientPanel.vue,McpClientPanel.vue. - Тесты: e2e —
e2e/functions/admin.spec.ts,e2e/permissions.spec.ts.
