Не работает авторизация - причины по убыванию частоты
Вход не проходит, либо пользователя выкидывает обратно сразу после успешной авторизации.
Как проверить
Смотрим, что вообще думает платформа о текущем посетителе:
global $USER;printf("авторизован=%s id=%s группы=%s\n", $USER->IsAuthorized() ? 'да' : 'нет', $USER->GetID() ?: '-', implode(',', $USER->GetUserGroupArray()));echo 'сессия: ', session_id() ?: 'нет', "\n";Пустая сессия при заполненном идентификаторе означает, что вход прошёл, а состояние не сохранилось. Пустые оба поля - вход вообще не состоялся.
Проверяем, как ставится кука авторизации:
curl -si -X POST https://example.com/auth/ \ -d 'AUTH_FORM=Y&TYPE=AUTH&USER_LOGIN=test&USER_PASSWORD=secret' \ | grep -i 'set-cookie\|location'# домен и путь в куке важнее её значения: по ним браузер решает, отправлять ли еёВ ответе должны быть куки сессии и авторизации. Домен в них важнее всего: кука,
поставленная на example.com, на shop.example.com не отправится, если домен не
указан с точкой в начале.
Причины
-
Кука авторизации ставится не на тот домен примерно 35% случаев
ПризнакВход проходит, но на поддомене или после редиректа пользователь снова гость.
ПроверкаСмотрим домен и путь у кук авторизации в ответе сервера или в браузере.
Что делатьЗадаём общий домен кук в настройках модуля главного, с точкой в начале, и очищаем прежние куки.
-
Сессия не сохраняется между запросами примерно 30% случаев
ПризнакИдентификатор пользователя есть, а на следующей странице снова гость.
ПроверкаПроверяем каталог сессий на запись, свободное место и настройки хранилища сессий PHP.
Что делатьВозвращаем права на каталог сессий либо переводим хранилище в базу или в память.
-
У группы нет доступа туда, куда идёт пользователь примерно 20% случаев
ПризнакВход проходит, но целевая страница снова показывает форму авторизации.
ПроверкаСмотрим группы пользователя и права этих групп на нужный раздел или модуль.
Что делатьВыдаём право группе, а не человеку: доступ к панели управления выдаётся отдельно от прав на разделы.
-
Форма закешировалась вместе со страницей примерно 15% случаев
ПризнакПосле входа шапка показывает гостя до перезагрузки или до сброса кеша.
ПроверкаПроверяем, попадает ли блок с формой в кеш компонента или в композитный кеш страницы.
Что делатьВыносим форму из кешируемой области либо помечаем блок как динамический для композита.
Если ничего не помогло
Смотрим журнал событий: неудачные входы платформа пишет туда сама.
$events = CEventLog::GetList(['ID' => 'DESC'], ['AUDIT_TYPE_ID' => 'USER_LOGIN']);while ($event = $events->GetNext()) { printf("%s %s %s\n", $event['TIMESTAMP_X'], $event['REMOTE_ADDR'], $event['DESCRIPTION']);}Смотрим группы пользователя и его права на нужный раздел:
$user = CUser::GetByID($userId)->Fetch();$groups = CUser::GetUserGroup($userId);printf("%s активен=%s группы=%s\n", $user['LOGIN'], $user['ACTIVE'], implode(',', $groups));
// право на раздел структуры сайта считается отдельно от прав на модулиecho 'право на /personal/: ', $APPLICATION->GetFileAccessPermission('/personal/'), "\n";# вход через каталог предприятия разбирают отдельно, там свои причиныНеактивная запись даёт тот же отказ, что и неверный пароль: форма показывает общее сообщение, чтобы не подсказывать перебором.
Записей нет вовсе - значит запросы до модуля авторизации не доходят, и разбирать надо маршрутизацию и веб-сервер. Записи есть, но с отказами - смотрят описание: там указано, чем именно вход отклонён.
Частые вопросы
Почему авторизация не работает на поддомене?
Кука авторизации по умолчанию ставится на конкретный домен. Чтобы она действовала на всех поддоменах, в настройках модуля указывают общий домен с точкой в начале, и старые куки после этого надо очистить.
Вход есть, а в админку не пускает.
Доступ к панели управления - отдельное право группы. Пользователь может свободно работать в публичной части и при этом не иметь права на админку: это разные настройки.
AJAX-авторизация сломалась после обновления.
Обычно из-за изменившегося набора служебных параметров формы: свой обработчик отправляет не всё, что ждёт компонент. Сравнивают состав запроса со штатной формой в браузере.
Как понять, отклонён вход по паролю или по правам?
По журналу событий: отказ по паролю и отказ по правам пишутся с разными описаниями. Форма при этом обоим показывает одинаковое сообщение, чтобы не подсказывать перебором.
Смежное
- Авторизация и сессии - оглавление подтемы
- Страница и форма авторизации - какой компонент за что отвечает
- Основы безопасности - сессии, куки и защита форм
- Пользователи, группы и права - права групп и два уровня доступа
- Слетает авторизация: время жизни сессии и запоминание входа - когда вход проходит, но не держится
- NTLM-авторизация не работает - вход по доменной учётной записи
- Регистрация покупателей: форма, подтверждение, свои поля - когда вход блокирует подтверждение
- Забыт пароль и потерян доступ в админку - смена пароля и право на админраздел
- Защита входа: перебор паролей, картинка с кодом, второй фактор - когда вход закрыт защитой намеренно
- LDAP не подключается: причины по убыванию частоты - вход через каталог предприятия
- Вход через соцсеть не работает: разбор причин - если не работает именно вход через соцсеть