Как отправить пароль пользователю при регистрации или изменении

Модуль расширенного управления меню для битрикс

Апрель 28, 2018

Теги: Пользователи, Как это сделать?

Конечно, по современным стандартам отправка пароля пользователю почтой не считается безопасной, но личные данные не на всех сайтах настолько ценны, чтобы беспокоится об этом, а клиент может попросить вас сделать, чтобы пароль все же отправлялся.

Чтобы отправить пароль при его изменении, нужно сначала  перехватить его, т.к. в базе данных он хранится в шифрованном виде, за это отвечает обработчик события "OnBeforeUserChangePassword". В данном обработчике пароль сохраняется при помощи статической переменной в функции singleton.

Далее, мы используем обработчик события "OnBeforeEventAdd", который отвечает за отправку писем. В данном обработчике мы берем сохраненный пароль из функции singleton и добавляем в массив $arFields для почтового события "USER_PASS_CHANGED". Все что нужно после этого - добавить макрос "#PASSWORD#" в шаблон письма.


<?php


namespace Partner;

\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible
    
'main'
    
'OnBeforeUserChangePassword'
    
'\Partner\SendPassword::onBeforeUserChangePassword'
); 

\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible
    
'main'
    
'OnBeforeEventAdd'
    
'\Partner\SendPassword::onBeforeEventAdd'
); 

class 
SendPassword 
{
    function 
onBeforeUserChangePassword($arParams)
    {
        
self::singleton(true,$arParams["PASSWORD"]);
    }
    
    function 
onBeforeEventAdd(&$event, &$lid, &$arFields, &$message_id, &$files)
    {
        if(
$event=="USER_PASS_CHANGED")
            
$arFields["PASSWORD"] = self::singleton();
    }
    
    private function 
singleton($write=false,$newValue=false)
    {
        static 
$value;
        if(
$write)
            
$value $newValue;
        return 
$value;
    }
}

Более сложный пример, отправляющий пароль при регистрации или изменении (требует добавления "#PASSWORD#" в шаблон "USER_INFO"):


<?php


namespace Partner;

\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible
    
'main'
    
'OnBeforeUserAdd'
    
'\Partner\SendPassword::onBeforeUserAddUpdate'
); 

\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible
    
'main'
    
'OnBeforeUserUpdate'
    
'\Partner\SendPassword::onBeforeUserAddUpdate'
); 

\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible
    
'main'
    
'OnAfterUserAdd'
    
'\Partner\SendPassword::onAfterUserAdd'
); 

\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible
    
'main'
    
'OnAfterUserUpdate'
    
'\Partner\SendPassword::onAfterUserUpdate'
); 

\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible
    
'main'
    
'OnBeforeEventAdd'
    
'\Partner\SendPassword::onBeforeEventAdd'
); 

class 
SendPassword 
{
    private static 
$alreadySent false;
    private static 
$needSend false;
    private static 
$password "";
    
    function 
onBeforeUserAddUpdate(&$arFields)
    {
        if(
$arFields["PASSWORD"])
        {
            
self::$needSend true;
            
self::$password $arFields["PASSWORD"];
        }
    }

    function 
onAfterUserAdd(&$arFields)
    {
        if(
self::$needSend && !!$arFields["ID"])
            
\CUser::SendUserInfo($arFields["ID"], SITE_ID""true);
    }

    function 
onAfterUserUpdate(&$arFields)
    {
        if(
self::$needSend && $arFields["RESULT"])
            
\CUser::SendUserInfo($arFields["ID"], SITE_ID""true);
    }

    function 
onBeforeEventAdd(&$event, &$lid, &$arFields, &$message_id, &$files)
    {
        if(
$event!="USER_PASS_CHANGED" && $event!="USER_INFO")
            return;
        if(
self::$alreadySent)
            return 
false;
        
$arFields["PASSWORD"] = self::$password;
        
self::$alreadySent true;
    }
}

См. также:

← Переход к списку