быстрая авторизация в битрикс, или как переключаться между пользователями без ввода пароля / хабр

Битрикс. регистрация и авторизация. часть 1. категория: web-разработка • cms битрикс

15.07.2022

Теги: CMS • Web-разработка • Авторизация • Битрикс • Компонент • Регистрация • Форма • ШаблонКомпонента

Самый простой вариант создания страницы регистрации, авторизации, восстановления пароля — создать раздел authи в самом начале файла /auth/index.phpопределить константу NEED_AUTH.

// обратите внимание на эту константуdefine("NEED_AUTH",true);require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");$APPLICATION->SetTitle("Авторизация и регистрация");
Вы зарегистрированы и успешно авторизовались.
// ссылка для выхода из личного кабинета$logout=$APPLICATION->GetCurPageParam("logout=yes",array("login","logout","register","forgot_password","change_password"));href
="<?=$logout;
"
>
Выйти

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");

После этого регистрация и авторизация уже работает:

Теперь нам надо кастомизоровать шаблоны системных компонентов:

  • system.auth.registration
  • system.auth.authorize
  • system.auth.forgotpasswd
  • system.auth.changepasswd

Для этого копируем:

  • bitrix/components/bitrix/system.auth.registration/templates/.default
    в local/templates/.default/components/bitrix/system.auth.registration/.default
  • bitrix/components/bitrix/system.auth.authorize/templates/.default
    в local/templates/.default/components/bitrix/system.auth.authorize/.default
  • bitrix/components/bitrix/system.auth.forgotpasswd/templates/.default
    в local/templates/.default/components/bitrix/system.auth.forgotpasswd/.default
  • bitrix/components/bitrix/system.auth.changepasswd/templates/.default
    в local/templates/.default/components/bitrix/system.auth.changepasswd/.default

Быстрая авторизация в битрикс, или как переключаться между пользователями без ввода пароля

Всем привет!

Не так давно на работе в рамках тестирования нового бизнес-процесса мне понадобилась возможность авторизации под разными пользователями.

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

В итоге появился компонент QuickAuth, о котором и пойдет речь ниже.

Вот так выглядит компонент на странице:

image

А вот так он подключается на любой странице:

$APPLICATION->IncludeComponent('ramapriya:quick.auth', '', []);

Выбор пользователя происходит с помощью системного компонента

main.user.selector

Чтобы максимально разделить логику и представление, в шаблоне я оставил только сам компонент выбора пользователя и кнопку отправки его ID на сервер. Перед этим, естественно, подключил все необходимые UI-библиотеки:

// template.php

foreach($arResult['extensions'] as $ext) {
    Extension::load($ext);
}

?>
<p><?=Loc::getMessage('QA_SELECT_USER_TEXT')?></p>
<div class="ui-ctl ui-ctl-w25 form-data">
<?php
        $APPLICATION->IncludeComponent('bitrix:main.user.selector', '', $arResult['select_user_component_params']);
?>    
</div>
<div class="ui-ctl ui-ctl-w25 form-data">
        <button id="authorize" class="ui-btn ui-btn-primary"><?=Loc::getMessage('QA_BUTTON_TEXT')?></button>    
</div>

Сам массив нужных расширений формируется и записывается в

$arResult

в классе компонента

В последнее время я люблю использовать на фронте Vuejs, благо Битрикс поддерживает его из коробки. Но из-за того, что нет прямого доступа к коду выбора пользователя, данный вариант отпал сразу, и выбор был сделан в пользу нативного JS, получающего ID из main.user.selector и отправляющего его на сервер с помощью битриксового метода BX.ajax.runComponentAction:

// script.js

window.onload = function() {

    let userId;
    
    const input = document.getElementById('select_user');
    const button = document.getElementById('authorize');

    input.addEventListener('change', () => {
        userId = input.value;
    })

    button.addEventListener('click', () => {
        if(!userId) {
            alert('Пользователь не выбран');
        } else {
            const request = sendAjax('ramapriya:quick.auth', 'sendUserId', 'class', {
                user: userId
            });

            request.then(response => {
                if(response.result === 'error') {
                    alert(response.error_description)
                } else {
                    window.location.reload(true)
                }
            })
        }
    })

    async function sendAjax(component, action, mode, params = {}) {

        const request = await BX.ajax.runComponentAction(component, action, {
            mode: mode,
            data: params
        });

        return await request.data
    }
    
}

За прием данных в классе компонента отвечает метод

sendUserIdAction

. Он обрабатывает запрос с помощью объекта

Request

, а также вызывает метод, авторизующий нужного пользователя:

// class.php

private function authorize($userId) {

        $USER = new CUser;

        if($USER->Authorize($userId)) {
            return true;
        } else {
            throw new SystemException('Ошибка авторизации');
        }

    }

    public function sendUserIdAction() {

        $request = Context::getCurrent()->getRequest();

        if(!$request['user']) {

            $result = [
                'result' => 'error',
                'error_description' => Loc::getMessage('QA_AJAX_RESPONSE_ERROR_DESCRIPTION')
            ];

        }

        $userId = (int) $request['user'];

        try {
            if($this->authorize($userId)) {
                $result = [
                    'result' => 'success'
                ];
            }
        } catch(SystemException $e) {
            $result = [
                'result' => 'error',
                'error_description' => $e->getMessage()
            ];
        }

        return $result;

    }

Важное дополнение: для того, чтобы можно было отправлять AJAX-запрос к компоненту, класс компонента должен унаследоваться от интерфейса Controllerable, а также объявить метод configureActions.

// class.php

use BitrixMainEngineContractControllerable;
use BitrixMainEngineActionFilter;

class QuickAuthComponent extends CBitrixComponent implements Controllerable {

    public function configureActions() {

    }

}

Я не буду цитировать здесь весь код компонента — кому интересно, посмотрят на гитхабе (ссылка выше).

В заключении скажу, что написанное решение сильно упростило мне тестирование бизнес-процессов, т.к. позволило быстро переключаться между пользователями, не заходя в админку.

Спасибо за внимание.

Шаблон компонента system.auth.registration

/*  * Файл local/templates/.default/components/bitrix/system.auth.registration/.default/template.php  */if(!defined("B_PROLOG_INCLUDED")||
 B_PROLOG_INCLUDED!==true)die();

class

="system-auth-registration" > <?=GetMessage('SYS_AUTH_REGISTRATION_TITLE');/* заголовок формы */// сообщение о том, как закончилась операция регистрацииShowMessage($arParams["~AUTH_RESULT"]);if($arResult["USE_EMAIL_CONFIRMATION"]==="Y"&&is_array($arParams["AUTH_RESULT"])&&$arParams["AUTH_RESULT"]["TYPE"]==="OK"):<?=GetMessage('SYS_AUTH_REGISTRATION_EMAIL_SENT');/* отправлено письмо для подтверждения */
Похожее:  Порядок регистрации на портале . Как зарегистрироваться и войти на портал Госуслуг Москвы PGU.MOS.RU

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *