Runbook: нет доступа к форме / ошибка авторизации¶
1. Когда использовать¶
Признаки инцидента:
- Пользователь видит
Нет доступа к задачеили переходит на/error/403. - Открытие задачи по ID не работает, хотя задача существует.
- Запросы к data source/форме возвращают
403 Forbidden. - Есть жалобы на «ошибка авторизации» после логина/refresh токена.
2. Как это работает (по коду)¶
2.1 Контур аутентификации¶
- SPA получает токен через
POST /api/auth/token-v2. - Обновление сессии:
POST /api/auth/token/refresh. - Проверка текущей сессии:
GET /api/auth/info. - Глобально
403перехватывается интерсептором и обычно ведет на/error/403(кроме allowlist URL).
2.2 Проверка доступа к задаче перед открытием формы¶
- SPA вызывает
GET /api/tasks/check-exist-and-access/{taskId}. - Backend возвращает:
IsTaskExists,IsUserHasAccess,TaskShortInfo.- При
IsTaskExists = trueиIsUserHasAccess = falseфронт формирует сообщение с owner/performers (noAccessToTheTask + accessDeniedMessage2).
2.3 Как рассчитывается CheckTaskAccess¶
TaskPermissionsService.CheckTaskAccess:
- Проверяет существование задачи.
SystemRobot-> всегдаtrue.- Уволенный пользователь (
IsFired) ->false. - Для admin-контекстов (
AdminDeleteContext/AdminDataSourceContext): - либо
God, - либо
Set-право на задачу. - Для обычного контекста:
- подписка на задачу (
TaskSubscriberInfoService) дает доступ, - для конфиденциальной задачи доступ через замещение не расширяется,
- затем проверка через
fn_UserTaskPermissions/fn_CheckUserTaskPermissions.
2.4 Data source-контур¶
DataSourceController при AccessDeniedException возвращает 403 (Forbid).
Это отдельный уровень прав: пользователь может иметь базовый доступ к задаче, но не иметь доступ к конкретному source/action.
3. Что смотреть при разборе (чек-лист)¶
- Зафиксировать:
userId,taskId, URL экрана, время, текст ошибки. - Проверить аутентификацию:
- успешен ли
auth/token-v2илиauth/token/refresh, - возвращает ли
auth/infoкорректного пользователя. - Проверить
tasks/check-exist-and-access/{taskId}: IsTaskExists = false-> это не доступ, а отсутствующая/некорректная задача,IsTaskExists = true,IsUserHasAccess = false-> чистый кейс прав.- Если это 403 от data source:
- зафиксировать конкретный endpoint source,
- разделить проблему прав задачи и прав source.
- Проверить, не уволен ли пользователь, нет ли impersonation-эффекта.
- Проверить, не конфиденциальная ли задача (для таких задач замещение ограничено).
- Проверить факт подписки пользователя на задачу.
- Проверить
fn_UserTaskPermissions/fn_CheckUserTaskPermissionsпо задаче.
4. Симптом -> вероятная причина -> проверка¶
| Симптом | Вероятная причина | Что проверить первым |
|---|---|---|
| После логина сразу 401/403 | невалидный access/refresh, истекла сессия | auth/token-v2, auth/token/refresh, auth/info |
Нет доступа к задаче при прямом открытии ID |
задача есть, но CheckTaskAccess=false |
tasks/check-exist-and-access/{taskId} |
| Только часть пользователей не открывает задачу | role/subscriber различия | UserTaskPermissions, подписка на задачу |
| Доступ к задаче есть, но source возвращает 403 | нет прав на конкретный data source | endpoint source + серверный AccessDeniedException |
| Через замещение доступ пропал на конкретных задачах | задача конфиденциальная | признак confidential + проверка access без замещения |
5. SQL для быстрой диагностики¶
-- Входные параметры
-- @user_id int
-- @task_id int
-- Базовая информация по пользователю
select
u.UserID,
u.IsFired
from dbo.Users u
where u.UserID = @user_id;
-- Базовая информация по задаче
select
t.TaskID,
t.SubcatID,
t.UserID as OwnerUserID
from dbo.Tasks t
where t.TaskID = @task_id;
-- Видит ли пользователь задачу через денормализованный контур прав
select top (1)
utp.TaskID,
utp.UserID
from dbo.UserTaskPermissions utp
where utp.TaskID = @task_id and
utp.UserID = @user_id;
-- Проверка права через функцию (MS SQL путь)
select
p.TaskID
from dbo.fn_CheckUserTaskPermissions(
@task_id,
@user_id,
(
select t.SubcatID
from dbo.Tasks t
where t.TaskID = @task_id
)
) p;
-- Проверка подписки на задачу
select top (20)
ms.TaskID,
ms.UserID,
ms.DateAdd
from dbo.MailSubscribers ms
where ms.TaskID = @task_id and
ms.UserID = @user_id
order by
ms.DateAdd desc;
6. Что приложить в задачу разработчикам¶
userId,taskId, URL и шаги воспроизведения.- Ответы
auth/infoиtasks/check-exist-and-access/{taskId}. - Текст/скрин
403(если от data source -- какой именно endpoint). - SQL-снимок из блока выше.
- Было ли перевоплощение (impersonate) и повторяется ли проблема без него.
Связанные документы¶
docs/domains/auth/backend.mddocs/domains/tasks/backend.mddocs/domains/task-forms/README.mddocs/reference/security/auth-security-model.md