Скрытие xml и json данных на umi-cms для неавторизованных пользователей
Статья предоставлена партнером 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;
}