Проверка авторизации через плагин в MODX

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

Автор материала

Артем Зернов. Веб-разработчик, создатель проекта Лектория, эксперт MODX Revolution, директор веб-студии OpenColour. Youtube-канал OpenModx.

12
6 минут на прочтение
Теги по этой теме:

Постановка задачи

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

Принцип работы

В отличии от встроенного в MODx управления ролями и группами, которое требует отдельного рассмотрения, логика работы гораздо проще. В имеющийся код добавляется плагин на событие OnLoadWebDocument и две системные настройки, с их помощью проверяется необходимость авторизации для каждой страницы, если она требуется, то либо допускает пользователя, либо выдает форму авторизации или ошибку (в зависимости от настройки).

Подготовка системных настроек

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

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

Состав ресурсов сайта
Состав ресурсов сайта

Отредактируйте системную настройку с именем unauthorized_page и в поле значение вставьте индекс ресурса - 29.

Редактирование системной настройки
Редактирование системной настройки

Создадим системную настройку, которая будет содержать идентификаторы шаблонов, к которым необходимо ограничить доступ неавторизованных посетителей сайта. В разделе Системные настройки & События нажмите кнопку создать новый параметр. В открывшемся окне добавьте:

  1. ключ authorized_templates;
  2. название setting_authorized_templates;
  3. в поле значение укажите идентификаторы шаблонов, к которым необходимо ограничить доступ.
Редактирование системной настройки
Редактирование системной настройки

На этом подготовка системных настроек закончена, перейдем к логике работы проверки авторизации.

Где изучить подробнее?

В курсе по профессиональной разработке интернет-магазинов на MODX Revolution вы научитесь создавать, помимо всего прочего функционала, личные кабинеты, а также формы для регистрации, авторизации и восстановления пароля.

Подробнее

Написание плагина

Создайте новый плагин во вкладке Элементы. Добавьте название checkAuthorizedTemplates и описание для него.

Создание плагина
Создание плагина

Перейдите на вкладку Системные события и поставьте галочку в поле Включен напротив события OnLoadWebDocument. Таким образом, мы привяжем созданный плагин к загрузке страниц.

Интересно? Подпишитесь на рассылку

Привязка плагина к событию
Привязка плагина к событию

Ниже рассмотрим код плагина, который необходимо будет вставить в соответствующее поле на вкладке Создать/редактировать плагин.

<?php
/**
 * Плагин для выдачи ошибки, при отсутствии авторизации на страницах, где требуется авторизация
 */
if ($modx->resource) {
    $template = $modx->resource->get('template');
    $templatesArray = $modx->getOption('authorized_templates');

    //Если список шаблонов - это строка, то предполагаем, что это список ID шаблонов, разделенных запятой
    if(is_string($templatesArray)) $templatesArray = explode(',',$templatesArray);

    //Если шаблон требует авторизацию и пользователь не авторизован, то выдаем страницу ошибки
    if(in_array($template, $templatesArray) && !$modx->user->hasSessionContext($modx->context->key)){
        //Вместо in_array($template, $templatesArray) можно разместить любую другую логику, которая соответствует вашему проекту
       
        //В системной настройке unauthorized_page лежит ID ресурса, на который будет выполнена переадресация 
        $modx->sendForward($modx->getOption('your_unauthorized_page_id'), [
            'merge' => 1, // Включает механизм склейки полей
            // список оригинальных полей, которые нужно исключить из результата
            'forward_merge_excludes' => 'id,template,class_key',
            'response_code' => $_SERVER['SERVER_PROTOCOL'] . ' 401 Unauthorized',
        ]);
        exit;
    }
}

Рассмотрим представленный код. В начале получаем индекс шаблона запрашиваемой страницы

$template = $modx->resource->get('template');

Получим значение системной настройки ‌authorized_templates, в которой перечислены индексы шаблонов, к которым есть доступ у авторизованных пользователей

$templatesArray = $modx->getOption('authorized_templates');

Если получений список представляет собой строку, то преобразовываем ее в массив

if(is_string($templatesArray)) $templatesArray = explode(',',$templatesArray);

Далее ставим условие - если шаблон посещенной страницы есть в массиве и пользователь не авторизован, то подменяем запрашиваемую страницу ресурсом, указанным в системной настройке unauthorized_page

if(in_array($template, $templatesArray) && !$modx->user->hasSessionContext($modx->context->key)){
    //Вместо in_array($template, $templatesArray) можно разместить любую другую логику, которая соответствует вашему проекту
   
    //В системной настройке unauthorized_page лежит ID ресурса, на который будет выполнена переадресация 
    $modx->sendForward($modx->getOption('unauthorized_page'), [
        'merge' => 1, // Включает механизм склейки полей
        // список оригинальных полей, которые нужно исключить из результата
        'forward_merge_excludes' => 'id,template,class_key',
        'response_code' => $_SERVER['SERVER_PROTOCOL'] . ' 401 Unauthorized',
    ]);
    exit;
}

Сохраните написаный код и проверьте функционирование плагина в связке с системными настройками.

Заключение

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

Подробный курс по теме

Артем Зернов
Мы используем куки на нашем сайте. Продолжая просмотр, вы соглашаетесь с условиями пользовательского соглашения
Пожалуйста, подождите. Процесс оформления заказа может занимать до 30 секунд.