Пользователи и доступ
Без входа доступны только страница входа и /api/health. Роли вложены друг в друга:
| Роль | Может |
|---|---|
| Наблюдатель | смотреть всё, подбирать кейсы по изменениям без создания прогона |
| Тестировщик | + создавать и проходить прогоны, назначать исполнителей, импортировать JUnit |
| Редактор | + кейсы, сьюты, гигиена, tsmc push, удаление прогонов |
| Администратор | + проекты, API-токены, пользователи, вехи и спринты |
- Пароли хранятся как scrypt-хеши, сессии — как SHA-256 хеши cookie (HttpOnly, SameSite=Lax, 30 дней).
- Изменяющие запросы из браузера обязаны нести заголовок
X-Requested-With: tsmc(защита от CSRF). - После 5 неудачных попыток входа пара «адрес + email» блокируется на 15 минут.
- У каждой версии кейса записан автор и канал изменения (интерфейс, API-токен,
tsmc push, импорт JUnit); в истории версий можно посмотреть, что изменилось относительно предыдущей версии: поля и шаги (добавленные, удалённые, изменённые). - Журнал действий (только администратор, «Журнал» в шапке): входы и неудачные попытки, пользователи и роли,
токены, создание и удаление проектов, сьютов, кейсов, прогонов, архив и закрепление прогонов, вехи и спринты,
push и импорт — кто, когда, с какого адреса. Пароли в журнал не попадают. API:
GET /api/audit?action=run&project=SHOP&before=<id>. - Учётные записи не удаляются, а отключаются: в истории результатов остаются имена. Смена пароля и отключение завершают все сессии пользователя. Последнего администратора нельзя понизить или отключить.
- API-токен проекта действует как редактор и только в своём проекте. CLI (
tsmc) работает только с токеном. - В прогоне у кейса есть исполнитель (фильтр «Мои») и автор каждого результата.
Открывая сервер в сеть, поставьте перед ним обратный прокси с HTTPS (nginx, Caddy) и задайте
TSMC_SECURE_COOKIES=1, TSMC_TRUST_PROXY=1.