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

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-2024, «1С-Битрикс», 2024
Наверх