Битрикс: в поисках потерянной капчи

Представляю Вашему вниманию короткую статью о том, как искать объяснение непонятных явлений в битриксе. В качестве примера приведу историю — когда-то, еще на заре изучения системы, мне удалось вывести в форме авторизации капчу. Причем как это вышло, выяснить не получилось. И вот сейчас, кастомизируя очередной шаблон компонента авторизации, обнаружился код ее выводящий. Спортивный интерес и отсутствие информации в официальной документации (хотя вполне может быть, я просто не нашел то что нужно) подтолкнули меня на маленькое расследование.

Первым делом, надо посмотреть в шаблоне компонента элемент массива, в котором приходит флаг показа капчи — несложно увидеть, что это $arResult["CAPTCHA_CODE"]. Массив arResult формируется внутри компонента, поэтому следующим шагом стало изучение содержимого bitrix\components\bitrix\system.auth.form\component.php. Найденный фрагмент кода показал, что за капчу отвечает функция NeedCAPTHAForLogin, которая по логину пользователя решает, выводить ее или нет.

if($APPLICATION->NeedCAPTHAForLogin($arResult["USER_LOGIN"]))
{
	$arResult["CAPTCHA_CODE"] = $APPLICATION->CaptchaGetCode();
}
else
{
	$arResult["CAPTCHA_CODE"] = false;
}

Api-help битрикса о назначении NeedCAPTHAForLogin рассказывать отказался, в настройках пользователя заветной галочки не оказалось. Остается найти и посмотреть исходник этой загадочной функции. С помощью Total Commander (или аналога) в директории bitrix\modules\main\ ищем файлы, содержащие текст NeedCAPTHAForLogin. Напомню, что такие исследования доступны счастливым обладателям версии в исходных кодах. Итак, результат поиска — файлик \bitrix\modules\main\classes\general\main.php. Находим кусок кода функции NeedCAPTHAForLogin, который ставит все точки над i

if(strlen($login) > 0)
{
	$rsUser = CUser::GetList($o, $b, array("LOGIN_EQUAL_EXACT" => $login));
	$arUser = $rsUser->Fetch();
	if($arUser)
	{
		$arPolicy = CUser::GetGroupPolicy($arUser["ID"]);
		$POLICY_ATTEMPTS = intval($arPolicy["LOGIN_ATTEMPTS"]);
		$USER_ATTEMPTS = intval($arUser["LOGIN_ATTEMPTS"]);
	}
}

Оказывается, вывод капчи в форме авторизации регулируется в настройках групповой политики неприметной галочкой в самом конце списка.

Приведенный способ иногда действует даже быстрее поиска по документации разработчиков. К тому же, дает возможность посмотреть на систему изнутри, понять принципы ее функционирования, и следовательно, писать более адаптированный код.

Если вам понравилась статья, подписывайтесь на обновления блога по rss или присоединяйтесь в twitter

Поделиться ссылкой с друзьями:

Метки: ,

Категории: Bitrix

Комментарии (7)

  1. Sergey:

    день добрый Алексей. я только разбираюсь в битриксе, ваш блог очень помогает, спасибо большое!

  2. Спасибо за отзыв, Sergey! Рад стараться:)

  3. PuBlik:

    Столкнулся с необходимостью отодвинуть вывод капчи не на третью попытку а дальше. Пересмотрел все настройки в разделе «настройки продукта», начал ковырять компонент, единственное описание NeedCAPTHAForLogin в интернете нашел только у вас.
    Огромное спасибо за статью!

  4. Hippie:

    Стандартная уже мысль, при очередном затыке — надо посмотреть у Валеева :)
    В очередной раз нашел решение. Спасибо!

  5. Иван:

    Спасибо! Реально помогла статья! Еще запутывает то, что в данной ситуации API битрикса при авторизации через $USER->Login() выдает сообщение «Неверный логин или пароль.», а про капчу ни слова!

  6. Сергей:

    Большое спасибо. Разбирался в коде и застрял именно на функции NeedCAPTHAForLogin

  7. Файлы формата CHM обновляются ежемесячно, тем не менее, возможно некоторое отставание их от онлайновой версии курса.