Документация для разработчиков
Темная тема

OnUserLoginExternal

Описание и параметры

mixed
функция-обработчик(
  array &arParams
);

Событие OnUserLoginExternal предназначено для возможности проверки имени входа и пароля во внешнем источнике. Обработчики этого события вызываются в методе CUser::Login, если ни один обработчик события OnBeforeUserLogin не вернул false, перед стандартной проверкой имени входа arParams['LOGIN'], пароля arParams['PASSWORD'] и попытки авторизовать пользователя.

Параметры

ПараметрОписание
arParams Массив полей для проверки имени входа и пароля:
  • LOGIN - Логин пользователя
  • PASSWORD - Пароль. Если параметр PASSWORD_ORIGINAL равен"Y", то в данном параметре был передан оригинальный пароль, в противном случае был передан хеш (md5) от оригинального пароля.
  • REMEMBER - Если значение равно "Y", то авторизация пользователя должна быть сохранена в куках.
  • PASSWORD_ORIGINAL - Если значение равно "Y", то это означает что PASSWORD не был сконвертирован в MD5 (т.е. в параметре PASSWORD был передан реальный пароль вводимый пользователем с клавиатуры), если значение равно "N", то это означает что PASSWORD уже сконвертирован в MD5.

Примечание. Параметр данного обработчика и элементы массива arParams являются ссылками на исходные переменные. Поэтому если вы измените значение параметра внутри обработчика, это приведет к смене значения исходной переменной поступившей на вход функции-обработчика.

Возвращаемое значение

Если необходимо авторизовать пользователя, то обработчик события должен вернуть идентификатор этого пользователя.

Пример функции-обработчика

<?
// пример авторизации пользователя из таблиц форума Innovision Power Board

// файл /bitrix/php_interface/init.php
AddEventHandler("main", "OnUserLoginExternal", Array("__IPBAuth", "OnUserLoginExternal"));
AddEventHandler("main", "OnExternalAuthList", Array("__IPBAuth", "OnExternalAuthList"));

define("IPB_TABLE_PREFIX", "ibf_");
define("IPB_VERSION", "2");

class __IPBAuth
{
    public static function OnUserLoginExternal(&$arArgs)
    {
        $groups_map = Array(
            /*'IPB Group ID' => 'Local Group ID',*/
            '4' => '1'
            );
        $table_user = IPB_TABLE_PREFIX."members";
        $table_converge = IPB_TABLE_PREFIX."members_converge";

        global $DB, $USER, $APPLICATION;
     extract($arArgs);

        if(IPB_VERSION == '1')
        {
            $strSql = "SELECT * FROM ".$table_user." WHERE name='".
                      $DB->ForSql($LOGIN)."' AND password='".md5($PASSWORD)."'";
        }
        else
        {
            $strSql =
                "SELECT t1.* ".
                "FROM ".$table_user." t1, ".$table_converge." t2 ".
                "WHERE t1.name='".$DB->ForSql($LOGIN)."' ".
                "    AND t1.email = t2.converge_email ".
                "    AND t2.converge_pass_hash = MD5(CONCAT(MD5(t2.converge_pass_salt), '".md5($PASSWORD)."'))";
        }

        $dbAuthRes = $DB->Query($strSql);
        if($arAuthRes = $dbAuthRes->Fetch())
        {
            $arFields = Array(
                "LOGIN" => $LOGIN,
                "NAME" => $arAuthRes['title'],
                "PASSWORD" => $PASSWORD,
                "EMAIL" => $arAuthRes['email'],
                "ACTIVE" => "Y",
                "EXTERNAL_AUTH_ID"=>"IPB",
                "LID" => SITE_ID
                );

            $oUser = new CUser;
            $res = CUser::GetList($O, $B, Array("LOGIN_EQUAL_EXACT"=>$LOGIN, "EXTERNAL_AUTH_ID"=>"IPB"));
            if(!($ar_res = $res->Fetch()))
                $ID = $oUser->Add($arFields);
            else
            {
                $ID = $ar_res["ID"];
                $oUser->Update($ID, $arFields);
            }

            if($ID>0)
            {
                $USER->SetParam("IPB_USER_ID", $arAuthRes['id']);

                $user_group = $arAuthRes['mgroup'];
                $arUserGroups = CUser::GetUserGroup($ID);
                foreach($groups_map as $ext_group_id => $group_id)
                {
                    if($ext_group_id==$user_group)
                        $arUserGroups[] = $group_id;
                    else
                    {
                        $arUserGroupsTmp = Array();
                        foreach($arUserGroups as $grid)
                            if($grid != $group_id)
                                $arUserGroupsTmp[] = $grid;
                        $arUserGroups = $arUserGroupsTmp;
                    }
                }
                CUser::SetUserGroup($ID, $arUserGroups);
                $arParams["STORE_PASSWORD"] = "N";

                return $ID;
            }
        }
    }

    public static function OnExternalAuthList()
    {
        return Array(
            Array("ID"=>"IPB", "NAME"=>"Invision Power Board")
            );
    }
}?>


© «Битрикс», 2001-2023, «1С-Битрикс», 2023