Пользователи

Пользователи и роли: роль-шаблон, отдельные права, города, блокировка и пароли.

Где найти
«Инструменты» (значок чемоданчика справа вверху) → Администрирование → «Пользователи». То же — палитрой команд: Ctrl+K и начните набирать название.
Права
право «Управление пользователями» — иначе пункт в меню не виден.
Функция показана в сквозном сценарии:Администрирование: пользователи, роли, журнал
Читаю как

Список учётных записей открывается в трёх местах, и везде это одна и та же панель:

  • «Инструменты» → «Администрирование» → «Пользователи» — отдельное окно «Пользователи и роли»;
  • меню пользователя → «Личный кабинет» → вкладка «Пользователи» (вкладка есть у тех, у кого есть право «Управление пользователями»);
  • меню пользователя → «Пользователи» — открывает кабинет сразу на этой вкладке. Пункт виден только при включённом входе.

Возможности

  • Создать учётную запись: логин, пароль, роль-шаблон и города.
  • Сменить роль и города прямо в строке таблицы.
  • «Права» — отдельные права поверх роли: матрица «вид объекта × действие» с охватом «нет / свои / все» и общие права (расчёты, выгрузки, журналы, справочники, журнал действий, пользователи, персональные данные).
  • Заблокировать и разблокировать, задать новый пароль, удалить.
  • Блокировка, смена роли, прав и городов действуют и на уже открытые сессии — без повторного входа.

Как это работает

Где хранятся учётные записи. По умолчанию — таблица 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)».

Шаги

  1. Откройте «Инструменты» и наберите в поиске «Пользователи» — пункт выделен рамкой.

    Пункт «Пользователи» в панели «Инструменты»

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

    Окно «Пользователи»

Пользователи: шаг 3

Примеры

Сотрудник, который ведёт журналы и правит только свои участки. Создайте пользователя с ролью «Просмотр». В «Правах» поставьте «Участки → Свойства: свои», отметьте «Журналы» и снимите «Выгрузки и отчёты». В заголовке — «отличий от роли: 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). Назначение — claim scope (api, arcgis, mcp), отпечаток пароля — claim pwf; 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.
Хотите увидеть эту функцию на своих данных?Покажем ТГИД на демонстрации и ответим на вопросы инженеров.
Запросить демо