Ограничение количества пользователей авторизованных под одним аккаунтом в разных браюзерах на сайте под управлением CMS Битрикс
Редактировать
Задача
Требуется ограничить количество одновременно авторизованных под одним и тем же аккаунтом пользователей на сайте. Нужно это для того, чтобы при доступе, например к платному контенту пользователь не мог дать доступ к своему аккаунту другу и они одновременно могли пользоаться этим контентом без дополнительной оплаты.
Решение
Для решения поставленной задачи нам нужно:
- Добавить пользовательское поля для сущности USER, в котором мы будем хранить код сессии пользователя.
- Добавить обработчик события авторизации пользователя (OnAfterUserAuthorize), который будет заполнять поле с ключем сессии
- Добавить обработчик подключения пролога, в котором будем проверять совпадение ключа сессии и в случае ошибки выкидывать пользователя из системы.
<?php
// в файле обработчиков событий, который подключаем в init.php
AddEventHandler('main', 'OnBeforeProlog', ['CUserLoginChecker', 'checkAuth']);
AddEventHandler('main', 'OnAfterUserAuthorize', ['CUserLoginChecker', 'saveSID']);
// класс с обработчиками
class CUserLoginChecker
{
public function saveSID()
{
global $USER;
$userId = $USER->GetID();
if ($userId && $userId > 0) {
$USER->Update($userId, [
'UF_CURRENT_SESSION' => $USER->GetSessionHash()
]);
}
}
public function checkAuth()
{
global $USER;
if ($USER->IsAuthorized()) {
$userFields = CUser::GetByID($USER->GetID())->Fetch();
$oldSession = $userFields['UF_CURRENT_SESSION'];
if ($oldSession !== $USER->GetSessionHash()) {
$USER->Logout();
}
}
}
}