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

Подскажите пожалуйста, как разрешить контент менеджеру редактирование только определённых ресурсов (и их подресурсов) в дереве.

Например дать право управлять только новостями и не показывать разделы относящиеся к каталогу.

Доступ контент менеджеру настроил по этому мануалу bayguzin.ru/main/uroki/uroki-modx-revolution/nastrojka-admin-paneli-klienta-modx-revo.html

Comments

Если делать по тому мануалу, и по общей системе, как это заведено в MODX-е, то только определив документы в различные группы ресурсов. Да, это крайне не удобно по многим причинам, но только так. Другой же, более разумный в этом случае способ — это разруливание на уровне плагина в момент попытки открытия документа для редактирования. Вот пример такого плагина:

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 раздела. Тогда он в дереве будет видеть только этот раздел и его дочерние документы. Указать сразу несколько разделов не получится.

Вот в данном случае подходящий вариант. А где это в настройках пользователя запрятано? Не могу найти

Открываете пользователя для редактирования, переходите во вкладку Настройки, и там создаете эту настройку.

Можно указывать несколько id через запятую. rtfm.modx.com/revolution/2.x/administering-your-site/settings/system-settings/tree_root_id

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

Особо глубоко не стал копать, но, думаю, можно писать плагин-проверку на событие OnBeforeDocFormSave. Там проверять кто владелец ресурса, есть ли права и т.п., и если что, возвращать ошибку. Но это в случае с редактированием. А вот в удалении не увидел событий, в которые можно было бы вклиниться и прервать удаление. Но, во-первых, удаление — это еще только пометка на удаление. Не давайте прав на очистку корзины. А в плагине на удаление можно навесить событие с проверкой, и если удаляет не свое, то слать уведомление админу. А еще можно навесить событие на контроллер страницы редактирования документа, и если пытается открыть не свой документ — запрещать. Но это только если не разрешено быстрое редактирование документов, там такой фокус не пройдет.

Спасибо, буду учиться кодить, думал это можно решить настройками и правами. Быстрое редактирование отключено, так что видимо это мой вариант.