Скрытие xml и json данных на umi-cms для неавторизованных пользователей

Материал из Umicms
Перейти к:навигация, поиск

Статья предоставлена партнером UMI.CMS Шириевым Артуром

Актуально для версии 18.

Ограничение доступа к REST-протоколам

Чтобы ограничить доступ к REST-протоколам udata, upage, uobject, usel и прочим, достаточно внести изменения в файл config.ini в корне сайта.

Например, для доступа без ограничения к протоколу udata используется параметр:

udata.http.allow = "1"

Чтобы ограничить, нужно заменить этот параметр на:

uobject.http.permissions = ""

Список возможных опций:

  • admin - доступно только администраторам сайта (администратор - пользователь, имеющий доступ к администрированию хотя бы одного модуля).
  • sv - доступно только супервайзерам.
  • auth - доступно только авторизованным пользователям.

Для остальных протоколов используются аналогичные параметры. Пример с одного моего личного сайта:

uobject.http.permissions = "admin"
udata.http.permissions = "admin"
upage.http.permissions = "admin"

Ограничение доступа к xml и json данным ({url}.xml или {url}.json)

Для решения данной задачи нет параметров в config.ini.

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

Для начала нужно в файле config.ini включить отслеживание этого события:

buffer-send-event-enable = "1"

Перехватка события (файл events.php в папке classes/modules/content шаблона, или custom_events.php в системной папке модуля):

new umiEventListener('systemBufferSend', 'content', 'object_redirect');

Права на доступ к макросу (permissions.php или permissions_custom.php):

$permissions= Array(
   'content' => array('object_redirect')
);

Сам макрос (в class.php или custom.php, закрывает доступ для всех, кроме суперпользователя):

public function object_redirect(iUmiEventPoint $oEventPoint) {
    if ($oEventPoint->getMode() === "before") {
        $buffer = outputBuffer::current();
        $hierarchy = umiHierarchy::getInstance();
        $path = getServer('REQUEST_URI');
        $permsCol = permissionsCollection::getInstance();
        $isSV = $permsCol->isSv();
        if (strpos($path, '.xml') !== false && !strpos($path, 'sitemap.xml') && !$isSV) {
            $path = str_replace('.xml','',$path);
            $buffer->status('301 Moved Permanently');
            $buffer->redirect($path);
        }
        if (strpos($path, '.json') !== false && !$isSV) {
            $path = str_replace('.json','',$path);
            $buffer->status('301 Moved Permanently');
            $buffer->redirect($path);
        }
    }
    return true;
}