CUser::Authorize авторизует пользователя программно — без формы
входа, без проверки пароля через интерфейс. Метод нужен там, где вход
происходит по иной логике: после подтверждения по ссылке из письма,
после успешной оплаты гостевого заказа, при входе через внешний сервис.
Разберём сигнатуру метода, разницу между обычной и «тихой» авторизацией и типичные ошибки, из-за которых пользователь остаётся неавторизованным несмотря на успешный вызов.
Базовый вызов
<?php
global $USER;
$result = $USER->Authorize($userId);
if ($result) {
// пользователь авторизован
} else {
// авторизация не удалась
echo $USER->LAST_ERROR;
}
Важная деталь: метод вызывается у глобального объекта $USER,
а не статически у класса. $USER — это и есть экземпляр
CUser, представляющий текущего посетителя; после успешного
вызова именно он становится авторизованным пользователем сессии.
Дополнительные параметры
<?php
$USER->Authorize(
$userId,
false, // сохранять ли авторизацию через cookie надолго
true, // обновлять ли дату последней активности
false // "тихая" авторизация без записи в лог событий безопасности
);
| Параметр | Назначение |
|---|---|
| ID пользователя | Кого авторизовать |
| Долгая сессия | Аналог флажка «Запомнить меня» |
| Обновление активности | Пишется ли текущий момент как дата последнего визита |
| Событие безопасности | Фиксируется ли вход в журнал для проактивной защиты |
Нужна помощь с Битрикс?
Типичный сценарий: вход по ссылке из письма
<?php
use Bitrix\Main\Loader;
$userId = (int)$_GET['user_id'];
$hash = (string)$_GET['hash'];
$expectedHash = md5($userId . 'секретная_соль');
if ($hash !== $expectedHash) {
// ссылка недействительна
return;
}
global $USER;
$USER->Authorize($userId);
Здесь принципиально важна проверка подписи ссылки. Без неё
Authorize превращается в уязвимость: любой, кто узнает
или подберёт идентификатор, сможет войти под чужим пользователем,
просто изменив параметр в адресе.
Проверка результата
Метод возвращает false, если пользователь не найден,
заблокирован или удалён. Проверять успешность нужно всегда — вызов
без проверки результата означает, что скрипт продолжит выполнение так,
будто вход состоялся, даже если он не удался.
<?php
global $USER;
if (!$USER->Authorize($userId)) {
// логируем и не продолжаем сценарий, рассчитанный на авторизованного пользователя
return;
}
Отличие от обычного входа через форму
Штатная форма авторизации, помимо самого входа, дополнительно проверяет
пароль, применяет капчу при подозрительной активности и учитывает
ограничения на количество попыток. Authorize ничего этого
не делает — метод просто помечает указанного пользователя как вошедшего.
Отсюда практическое следствие: вызывать этот метод стоит только тогда, когда личность пользователя уже подтверждена другим способом — например, той же проверкой хеша в ссылке или успешной оплатой заказа. Использовать его как замену проверке пароля нельзя.
Завершение сессии
Логическая пара к Authorize — метод Logout(),
завершающий текущую сессию:
<?php
global $USER;
$USER->Logout();
Частые ошибки
- Нет проверки подписи или прав перед вызовом. Прямая уязвимость подмены пользователя через параметр в адресе.
- Результат не проверяется. Скрипт считает, что пользователь вошёл, хотя авторизация не удалась.
-
Вызов у неинициализированного объекта. Используется
именно глобальный
$USER, а не создание нового экземпляраCUser— иначе изменения не относятся к текущей сессии. - Метод используется как замена проверке пароля. Подходит только когда личность уже подтверждена другим способом.
Итог
CUser::Authorize программно входит под указанным пользователем,
вызываясь у глобального объекта $USER. Метод не проверяет
пароль и не заменяет штатную форму входа — он предполагает, что личность
пользователя уже подтверждена вашей собственной логикой, и ответственность
за эту проверку лежит на разработчике, а не на самом методе.
