Кальтер / Блог

Внутренний инструмент с ИИ: как быстро собрать админ-панель для команды

Планируем внутреннюю панель от ролей и рабочих операций до серверных проверок доступа и тестов отказа.

Материал подготовлен с помощью ИИ; источники и расчёты проверены редакцией ZASLON.

Внутренний инструмент должен ограничивать действия по роли и сессии; на схеме: Сотрудник, Роль и сессия, Разрешённые операции.
Редакционная схема ZASLON. Условная иллюстрация механизма; не рыночные данные и не интерфейс сервиса.

Внутренняя панель работает с реальными процессами и данными, поэтому её проектируют от действий сотрудников, ролей и границ доступа. Начинать только с генерации таблицы опасно: сотрудник может увидеть чужую запись, изменить статус без полномочий или выполнить административное действие не для той команды.

Кейс: очередь обращений поддержки

У команды есть четыре действия: просмотреть новые обращения, назначить ответственного, изменить состояние и закрыть обращение. Сначала задай роли:

Роль Рабочая задача Доступный минимум
Агент поддержки ответить на обращение видеть назначенное и брать свободное из разрешённой очереди
Руководитель смены распределять нагрузку видеть обращения своей команды и менять назначение
Администратор управлять правилами и сотрудниками отдельные административные действия с повышенной проверкой

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

Для каждого действия запиши не только роль, но и контекст записи: агент может просматривать назначенное ему обращение; руководитель — записи своей команды; администратор — действие по обоснованной необходимости. Одного role=admin недостаточно, если данные ещё разделяются по филиалам или клиентским организациям.

Рабочий сценарий до экранов

Опиши путь одного обращения: новая запись приходит в очередь → агент открывает её → назначает себе или получает назначение → меняет статус на «в работе» → записывает результат ответа → завершает. Для каждого шага отметь, что видит пользователь, что сохраняется и кто может исправить ошибку.

Попроси ИИ сначала проверить схему процесса:

Создай прототип очереди обращений для трёх ролей: агент, руководитель смены и администратор. Сначала составь матрицу действий и области данных. Для каждого endpoint укажи server-side authorization check и ожидаемый отказ. Реальные данные не используй; создай явно синтетические записи. В UI не скрывай отказ так, будто операция прошла. До согласования прав код не генерируй.

После согласования сделай список и карточку на фиктивных данных. Подключение к реальному хранилищу добавляй только после проверки ролей и отрицательных случаев.

Проверки доступа выполняются на сервере

OWASP Authorization Cheat Sheet рекомендует применять принцип наименьших привилегий, запрещать по умолчанию и проверять разрешения на каждом запросе (OWASP Authorization). Эти рекомендации особенно важны для панели, где запрос можно отправить вручную, минуя кнопку. Скрытие «Удалить» в UI улучшает интерфейс, но не ограничивает серверный endpoint.

Если данные хранятся в PostgreSQL и применён Row Level Security, политики могут ограничивать доступ к строкам на уровне базы; Supabase описывает RLS и требует обдуманной настройки правил и прав (Supabase RLS). RLS не заменяет аутентификацию или проверку бизнес-операции. Проверь реальные роли приложения и убедись, что привилегированный ключ не оказался в клиентском коде.

Набор негативных проверок должен включать: без сессии запрос закрыт; агент не читает чужую команду; нельзя назначить себя администратором; агент не закрывает запись, если это действие не входит в его право; смена ID в URL не открывает чужую заявку. Тестируй каждый API-маршрут, а не только экран.

Удобная панель помогает не ошибиться

Покажи важный контекст записи до опасного действия: владелец, статус, команда, дата последнего изменения. Дай подтверждение для удаления/массового изменения и сообщай, когда запись уже изменил коллега. Для каждого перехода статуса определи, можно ли его отменить и где видна история. Если запись закрыта, кнопка «Ответить» должна следовать реальному процессу, а не оставаться активной только потому, что её сгенерировал шаблон.

Внутренние инструменты должны поддерживать рабочую последовательность, а не имитировать «красивый админ-дэшборд». Добавляй только те поля и фильтры, которые нужны сотруднику в данном сценарии. Для операций, влияющих на клиента, проверь кто выполнил изменение и каким был исходный статус. Не собирай лишнюю аналитику, если команде не определено, кто и зачем её использует.

Условия перехода от прототипа

Используй синтетические данные, пока не проверены роли, области видимости, история изменений, резервное восстановление и обработка ошибок. Для реальных данных нужен согласованный доступ и проверка путей хранения/логирования. Прототип на экране не доказывает, что команда может безопасно работать с production-данными; до такого шага требуется отдельный технический review и проверка на целевой инфраструктуре.

История изменений и защита от двух операторов

Для очереди поддержки полезна запись: кто назначил обращение, кто изменил статус и когда. Храни не только текущий статус, но и историю событий, если она нужна для разбирательства ошибок и передачи смены. Не записывай в журнал больше персонального содержимого, чем необходимо; для диагностики часто достаточно идентификатора, действия и результата проверки.

Добавь конкурентный сценарий: два агента открыли одну свободную заявку. Первый назначает её себе; второй почти одновременно пытается сделать то же. Сервер должен проверить текущее назначение в момент записи и вернуть конфликт проигравшему, а UI обновить строку и сообщить, кто уже работает с обращением. Кнопка, которая продолжает показывать «свободно», не должна выдавать ложное подтверждение.

Операционная проверка команды

Проверь маршрут с сотрудником в каждой тестовой роли: получена ли очередь; можно ли взять обращение; что происходит при повторном открытии; где видны новые сообщения; как передать задачу на другую смену; что видит сотрудник при потере сессии. Используй синтетические записи и отдельную среду. Убедись, что «ошибка сохранения» не оставляет заявку помеченной как закрытая только на экране.

Определи восстановление: как найти случайно закрытое обращение, кто может отменить ошибочное назначение и какие операции требуют вторичного подтверждения. Если массовая обработка нужна только руководителю, её следует отдельно выделить и тестировать выборку перед запуском. Запиши безопасный порядок действия и способ отменить изменение до того, как добавишь кнопку массового завершения.