25 янв. 2014 г., 6:00

Как ограничить контент менеджеру доступ к папкам ресурсов?

Подскажите пожалуйста, как разрешить контент менеджеру редактирование только определённых ресурсов (и их подресурсов) в дереве.
Например дать право управлять только новостями и не показывать разделы относящиеся к каталогу.
Доступ контент менеджеру настроил по этому мануалу bayguzin.ru/main/uroki/uroki-modx-revolution/nastrojka-admin-paneli-klienta-modx-revo.html
Если делать по тому мануалу, и по общей системе, как это заведено в MODX-е, то только определив документы в различные группы ресурсов. Да, это крайне не удобно по многим причинам, но только так. Другой же, более разумный в этом случае способ — это разруливание на уровне плагина в момент попытки открытия документа для редактирования. Вот пример такого плагина:
<?php switch($modx->event->name){ case 'OnManagerPageBeforeRender': switch($scriptProperties['controller']->config['controller']){ /* Проверяем права на редактирование документов */ case 'resource/update': // Проверяем наличие настройки allow_to_update (задается в настройках пользователя) // В ней мы перечисляем, какие документы пользователю можно редактировать // Если настройка задана, но id документа отсутствует в перечисленных разрешенных, // То возвращаем ошибку доступа if($allow_to_update = $modx->getOption('allow_to_update')){ if(!is_array($allow_to_update)){ $allow_to_update = explode(",", $allow_to_update); $allow_to_update = array_map('trim', $allow_to_update); } // if(!in_array($scriptProperties['controller']->scriptProperties['id'], $allow_to_update)){ $scriptProperties['controller']->failure('Доступ запрещен'); return; } } break; } //print_r($scriptProperties['controller']->config); //print_r($scriptProperties['controller']->scriptProperties); break; }
Но это, что называется, «защита от дурака», то есть этот метод позволяет на уровне интерфейся рулить что можно открывать, а что нельзя (для удобства менеджера), но ничто не мешает ему отправлять Ajax-запрос на редактирование с указанием произвольного id. То есть этот метод не до конца защищает. Защита же на уровне разделения по группам ресурсов более надежная, ибо работает на уровне самого объекта ресурса, где би и как бы его не получили, а не просто на уровне рендеринга страницы редактирования.
Для вас этот плагин просто как пример. Там вам придется свои более сложные условия писать, типа перебрать всех родителей ресурса, и если это новость, то ее редактировать можно.
А так же не забудьте таким манагерам отключить разрешение быстрого редактирования страниц, ибо этот плагин там не сработает.
Кстати, есть еще вариант: если предполагается, что контент-менеджер будет работать только с одним конкретным разделом, можно в настройках пользователя задать tree_root_id = id раздела. Тогда он в дереве будет видеть только этот раздел и его дочерние документы. Указать сразу несколько разделов не получится.
Вот в данном случае подходящий вариант. А где это в настройках пользователя запрятано? Не могу найти
Открываете пользователя для редактирования, переходите во вкладку Настройки, и там создаете эту настройку.
?
Здравствуйте. Подскажите можно ли разделить права всех менеджеров контента, чтобы каждый из них мог работать только с тем что сам создал. Вот почему я задаю такой вопрос: один менеджер удалил контент другого, а тот отредактировал в отмездку статью удалившего. Да и вообще я считаю, что такое разделение необходимо, чтобы каждый отвечал только за свой контент. Единственное, я использую Tickets в качестве ресурсов для написания постов, но думаю это принципиально не важно.
Особо глубоко не стал копать, но, думаю, можно писать плагин-проверку на событие OnBeforeDocFormSave. Там проверять кто владелец ресурса, есть ли права и т.п., и если что, возвращать ошибку. Но это в случае с редактированием. А вот в удалении не увидел событий, в которые можно было бы вклиниться и прервать удаление. Но, во-первых, удаление — это еще только пометка на удаление. Не давайте прав на очистку корзины. А в плагине на удаление можно навесить событие с проверкой, и если удаляет не свое, то слать уведомление админу. А еще можно навесить событие на контроллер страницы редактирования документа, и если пытается открыть не свой документ — запрещать. Но это только если не разрешено быстрое редактирование документов, там такой фокус не пройдет.
Спасибо, буду учиться кодить, думал это можно решить настройками и правами. Быстрое редактирование отключено, так что видимо это мой вариант.

Добавить комментарий