Нет доступа к форме или ошибка авторизации — Решение проблем¶
Этот сценарий помогает разобрать обращения, когда пользователь не может открыть форму задачи или получает ошибку авторизации. Здесь собраны признаки инцидента, логика проверки доступа, чек-лист диагностики и SQL-запросы для быстрой проверки прав.
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фронтенд показывает сообщение «нет доступа» с владельцем и исполнителями задачи.
2.3 Как рассчитывается доступ к задаче¶
Доступ к задаче проверяется по следующей логике:
- Проверяется существование задачи.
- Системный робот (
SystemRobot) — доступ всегда есть. - Уволенный пользователь (
IsFired) — доступа нет. - Для административных операций (удаление задачи, доступ к data source):
- либо полный доступ (super-admin),
- либо право на изменение задачи (Set).
- Для обычного открытия задачи:
- подписка на задачу даёт доступ,
- для конфиденциальной задачи доступ через замещение не расширяется,
- затем проверка через функции БД
fn_UserTaskPermissions/fn_CheckUserTaskPermissions.
2.4 Доступ к data source¶
Запрос к data source при отказе в доступе возвращает 403.
Это отдельный уровень прав: пользователь может иметь базовый доступ к задаче, но не иметь доступа к конкретному source или действию.
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. Что приложить при обращении в поддержку¶
Если разобраться не удалось, соберите и приложите к обращению в поддержку 1Ф:
userId,taskId, URL и шаги воспроизведения.- Ответы
auth/infoиtasks/check-exist-and-access/{taskId}. - Текст или скриншот
403(если от data source — какой именно endpoint). - SQL-снимок из блока выше.
- Было ли перевоплощение (impersonate) и повторяется ли проблема без него.