Поддержка серверов

CUser::Login: метод Битрикс

Постоянная ссылка: http://bxapi.ru/src/?id=161960

//    CUser::Login()
//    /bitrix/modules/main/classes/general/user.php:783

    public function Login($login, $password, $remember="N", $password_original="Y")
    {
        /** @global CMain $APPLICATION */
        global $DB, $APPLICATION;

        $result_message = true;
        $user_id = 0;
        $applicationId = null;
        $applicationPassId = null;

        $arParams = array(
            "LOGIN" => &$login,
            "PASSWORD" => &$password,
            "REMEMBER" => &$remember,
            "PASSWORD_ORIGINAL" => &$password_original,
        );

        unset($_SESSION["SESS_OPERATIONS"]);
        unset($_SESSION["MODULE_PERMISSIONS"]);
        $_SESSION["BX_LOGIN_NEED_CAPTCHA"] = false;

        $bOk = true;
        $APPLICATION->ResetException();
        foreach(GetModuleEvents("main", "OnBeforeUserLogin", true) as $arEvent)
        {
            if(ExecuteModuleEventEx($arEvent, array(&$arParams))===false)
            {
                if($err = $APPLICATION->GetException())
                {
                    $result_message = array("MESSAGE"=>$err->GetString()."
", "TYPE"=>"ERROR");
                }
                else
                {
                    $APPLICATION->ThrowException("Unknown login error");
                    $result_message = array("MESSAGE"=>"Unknown login error"."
", "TYPE"=>"ERROR");
                }

                $bOk = false;
                break;
            }
        }

        if($bOk)
        {
            //external authentication
            foreach(GetModuleEvents("main", "OnUserLoginExternal", true) as $arEvent)
            {
                $user_id = ExecuteModuleEventEx($arEvent, array(&$arParams));

                if(isset($arParams["RESULT_MESSAGE"]))
                {
                    $result_message = $arParams["RESULT_MESSAGE"];
                }
                if($user_id > 0)
                {
                    break;
                }
            }

            if($user_id <= 0)
            {
                //internal authentication OR application password for external user

                $user_id = self::LoginInternal($arParams, $result_message, $applicationId, $applicationPassId);

                if($user_id <= 0)
                {
                    //no user found by login - try to find an external user
                    foreach(GetModuleEvents("main", "OnFindExternalUser", true) as $arEvent)
                    {
                        if(($external_user_id = intval(ExecuteModuleEventEx($arEvent, array($arParams["LOGIN"])))) > 0)
                        {
                            //external user authentication
                            //let's try to find application password for the external user
                            if(($appPassword = ApplicationPasswordTable::findPassword($external_user_id, $arParams["PASSWORD"], ($arParams["PASSWORD_ORIGINAL"] == "Y"))) !== false)
                            {
                                //bingo, the user has the application password
                                $user_id = $external_user_id;
                                $applicationId = $appPassword["APPLICATION_ID"];
                                $applicationPassId = $appPassword["ID"];
                            }
                            break;
                        }
                    }
                }

                if($user_id <= 0 && $result_message === true)
                {
                    $APPLICATION->ThrowException(GetMessage("WRONG_LOGIN"));
                    $result_message = array("MESSAGE"=>GetMessage("WRONG_LOGIN")."
", "TYPE"=>"ERROR", "ERROR_TYPE" => "LOGIN");
                }
            }
        }

        // All except Admin
        if ($user_id > 1 && $arParams["CONTROLLER_ADMIN"] !== "Y")
        {
            if(!static::CheckUsersCount($user_id))
            {
                $user_id = 0;
                $APPLICATION->ThrowException(GetMessage("LIMIT_USERS_COUNT"));
                $result_message = array(
                    "MESSAGE" => GetMessage("LIMIT_USERS_COUNT")."
",
                    "TYPE" => "ERROR",
                );
            }
        }

        $arParams["USER_ID"] = $user_id;

        $doAuthorize = true;

        if($user_id > 0)
        {
            if($applicationId === null && CModule::IncludeModule("security"))
            {
                /*
                MFA can allow or disallow authorization.
                Allowed if:
                - OTP is not active for the user;
                - correct "OTP" in the $arParams (filled by the OnBeforeUserLogin event handler).
                Disallowed if:
                - OTP is not provided;
                - OTP is not correct.
                When authorization is disallowed the OTP form will be shown on the next hit.
                Note: there is no MFA check for an application password.
                */

                $arParams["CAPTCHA_WORD"] = $_REQUEST["captcha_word"];
                $arParams["CAPTCHA_SID"] = $_REQUEST["captcha_sid"];

                $doAuthorize = \Bitrix\Security\Mfa\Otp::verifyUser($arParams);
            }

            if($doAuthorize)
            {
                $this->Authorize($user_id, ($arParams["REMEMBER"] == "Y"), true, $applicationId);

                if($applicationPassId !== null)
                {
                    //update usage statistics for the application
                    Main\Authentication\ApplicationPasswordTable::update($applicationPassId, array(
                        'DATE_LOGIN' => new Main\Type\DateTime(),
                        'LAST_IP' => $_SERVER["REMOTE_ADDR"],
                    ));
                }
            }
            else
            {
                $result_message = false;
            }

            if($applicationId === null && $arParams["LOGIN"] <> '')
            {
                //the cookie is for authentication forms mostly, does not make sense for applications
                $cookie = new Bitrix\Main\Web\Cookie("LOGIN", $arParams["LOGIN"], time()+60*60*24*30*60);
                Main\Context::getCurrent()->getResponse()->addCookie($cookie);
            }
        }

        $arParams["RESULT_MESSAGE"] = $result_message;

        $APPLICATION->ResetException();
        foreach(GetModuleEvents("main", "OnAfterUserLogin", true) as $arEvent)
            ExecuteModuleEventEx($arEvent, array(&$arParams));

        if($doAuthorize == true && $result_message !== true && (COption::GetOptionString("main", "event_log_login_fail", "N") === "Y"))
            CEventLog::Log("SECURITY", "USER_LOGIN", "main", $login, $result_message["MESSAGE"]);

        return $arParams["RESULT_MESSAGE"];
    }

Блог разработчика

9 августа 2016 ResizeImageGet и простой водяной знак налету

Сегодня поговорим о том как проще всего воткнуть водяной знак на картинки в Битрикс. Например, на все изображения каталога.

21 июля 2016 Добавление вкладки в CRM коробки Битрикс24

В этом посте я покажу, как легко и просто добавить вкладку в сущность CRM. И не просто добавить, а вывести там свой контент.

21 июля 2016 Как просто обращаться из коробки Битрикс24 на сайт на базе Битрикс

К примеру вам хочется внутренним скриптом дернуть с сайта-магазина информацию, которая там, в свою очередь, закрыта некоторыми правами. Например, админскими. Можно конечно мутить свой REST, или иной формат общения, но проще всего воспользоваться штатным инструментом:

0  
Boomerml
Появилась задача динамически авторизовывать пользователя, но после превышение количества попыток авторизоваться не получалось. Из документации понятно что:

Если было превышено количество попыток подключения метод просто не будет авторизовывать пользователя с ошибкой "Неправильный логин или пароль"

Можно передать в метод каптчу принудительно, следующим образом
Код
global $USER;
if (!is_object($USER)) $USER = new CUser;
// captcha
$_REQUEST['captcha_word'] = '8GFXB';
$_REQUEST['captcha_sid'] = '0788d2b003c3c31a9f955aec91dcd17e';
// captcha
$arAuthResult = $USER->Login("admin", "123456", "Y");
$APPLICATION->arAuthResult = $arAuthResult;
А вот условие для вывода каптчи, после превышение количество попыток
Код
if($APPLICATION->NeedCAPTHAForLogin($arResult["USER_LOGIN"]))
    $arResult["CAPTCHA_CODE"] = $APPLICATION->CaptchaGetCode();
else
    $arResult["CAPTCHA_CODE"] = false;
При этом вывод капчи регулируется в настройках 'Группы пользователей' во вкладке 'Безопасность' неприметной галочкой в самом конце списка 'Количество попыток ввода пароля до показа CAPTCHA'.
Имя Цитировать 0  
Текст сообщения*
Загрузить изображение