Как известно, в Joomla существует фиксированный набор групп пользователей с заранее предопределенными правами на различные функции системы. Однако при создании сайтов возникают задачи, которые требуют наличия дополнительных групп пользователей со специфическими правами. Наиболее распространенным решением этой задачи является использование компонента-хака JACLPlus, но не всегда это уместно. На прошлой неделе мне пришлось решать подобную задачу и в этой статье я расскажу как это было реализовано.
Постановка задачи
Необходимо добавить в Joomla дополнительную группу пользователей, которая обладала бы следующими правами:
Доступ к административной панели
Доступ к заданному компоненту (для простоты выберем компонент Remository)
Не имела бы доступа к остальным разделам административной панели Joomla
Как мы видим, наиболее похожая группа пользователей это Manager, так как в ней есть и доступ в административную панель Joomla, и нет доступа к большинству административных функций (управление пользователями, расширениями и т.д.). Чего же нам нехватает? Да, в принципе, самой малости:
Нет доступа к компоненту Remository)
Есть доступ к Медиа менеджеру, Меню и Материалам
Для решения нашей задачи можно пойти двумя путями: изменить права группы Manager и добавить новую группу, похожую частично на Manager, но с урезанными правами. Первая задача достаточно простая, но не столь интересная в реализации. Эту тему уже не раз обсуждали на форуме, и решения найти не проблема. Я же хочу рассказать о том, как создать дополнительную группу, и как ее наделить нужными правами для решения нашей задачи.
Перед началом модификаций рекомендую создать резервную копию изменяемых файлов и базы данных. Если у вас вдруг что-то не получится наличие резервной копии позволит вам откатить изменения и восстановить работоспособность сайта.
Добавление новой группы пользователей Joomla
Как известно, в Joomla существует следующая иерархия пользователей:
Таким образом, нам надо добавить группу пользователей (назовем ее DownloadsManager) в качестве дочерней для Public Backend, чтобы дерево групп пользователей приняло вид:
Информация о существующих группах пользователей и их иерархии располагается в таблице jos_core_acl_aro_groups. Я не буду серьезно вдаваться в подробности технической реализации хранения данных в этой таблице, ограничусь готовым SQL-запросом, который позволит нам добавить нужную группу:
SET @parent_name = 'Public Backend';
SET @new_name = 'DownloadsManager';
SELECT @ins_id := group_id, @ins_lft := lft, @ins_rgt := rgt
FROM jos_core_acl_aro_groups
WHERE name = @parent_name;
SELECT @new_id := MAX(group_id) + 1 FROM jos_core_acl_aro_groups;
UPDATE jos_core_acl_aro_groups SET rgt=rgt+2 WHERE rgt>=@ins_rgt;
UPDATE jos_core_acl_aro_groups SET lft=lft+2 WHERE lft>@ins_rgt;
INSERT INTO jos_core_acl_aro_groups (group_id,parent_id,name,lft,rgt)
VALUES (@new_id,@ins_id,@new_name,@ins_rgt,@ins_rgt+1);
После выполнения данного запроса в списке доступных групп пользователей появится DownloadsManager. Однако, если мы в Менеджере пользователей попробуем создать пользователя с такой группой, мы гарантированно получим ошибку: «You cannot create a user with this user Group level, only Super Administrators have this ability». Это означает, что текущий пользователь не может создать пользователя с группой, которая не является дочерней, по отношению к группе текущего пользователя. Это ограничение было введено для того, чтобы пользователи группы Администратор не могли создавать Суперадминистраторов.
В нашем случае, созданная группа DownloadsManager не является дочерней даже для Суперадминистратора, поэтому создать такого пользователя не получается. Чтобы это разрешить, мы сделаем небольшую модификацию, которая на безопасность не особо повлияет:
if (!in_array($row->gid,getGIDSChildren($my->gid))) {
и заменим ее на:
if ($my->gid != 25 && !in_array($row->gid,getGIDSChildren($my->gid))) {
В результате данной модификации, мы разрешим пользователям группы Суперадминистратор создавать пользователей любых групп.
Однако, создать группу и получить возможность добавлять в нее пользователей это ползадачи. Нам нужно теперь настроить права этой группы: возможность авторизации в административной панели Joomla, доступ к компоненту Remository и запретить доступ к материалам сайта.
Предоставление доступа в административную панель Joomla
Права групп пользователей прописаны статически в файле /includes/gacl.class.php. Для того, чтобы наша группа пользователей имела право на авторизацию в административной панели Joomla необходимо в этом файле, после строчки:
Так, теперь пользователи этой группы могут беспрепятственно входить в административную панель Joomla и фактически равны по правам пользователям группы Manager, однако пока не имеют доступа к компоненту Remository и могут редактировать материалы сайта.
Предоставление доступа к компоненту Remository
Для того, чтобы пользователи группы DownloadsManager могли работать с компонентом Remository необходимо, чтобы во-первых пользователи этой группы видели меню Компоненты и, во-вторых, чтобы они имели доступ к самому компоненту.
Для начала, добавим в /includes/gacl.class.php права на компонент. Для этого найдем строчку:
Все, пользователи группы DownloadsManager будут иметь доступ к компоненту Remository. Займемся теперь доступностью пункта меню Компоненты
Настройка видимости пунктов меню административной панели Joomla
Главное меню административной панели Joomla выводится модулем mod_fullmenu, расположенном в папке /administrator/modules. Его мы и будем править, чтобы настроить видимость пунктов в зависимости от прав пользователя.
В файле /administrator/modules/mod_fullmenu.php находим строчку:
Все, теперь пользователей группы DownloadsManager станет доступно меню Компоненты, в котором будет только один подпункт — Remository. Другие компоненты будут недоступны (за исключением com_content, com_menus и com_typedcontent).
Мы уже очень близки к поставленной цели: у нас есть новая группа, пользователи этой группы имеют доступ к административной панели Joomla и в ней могут работать с административной частью компонента Remostitory. Кроме того, пользователь уже не видит лишних пунктов меню (Медиа-менеджер, Меню, Материалы). Дело за малым: закрыть реальный доступ к редактированию меню и материалов сайта.
Запрет группе доступа к редактированию меню и материалов
Сначала немного расширим список прав групп, чтобы явно предоставить права на Меню и Материалы пользователям групп Manager, Administrator и Super administrator. Для этого в файле /includes/gacl.class.phpпосле строчки:
Теперь, необходимо отредактировать файлы этих компонентов, чтобы запретить доступ к ним тем группам, у которых права явно не прописаны. Для этого, выполним следующие модификации:
Открываем файл /administrator/components/com_menus/admin.menus.php и сразу после строчки:
defined( '_VALID_MOS' ) or die( 'Restricted access' );
Все! После вставки данных проверок, пользователи группы DownloadsManager гарантированно получат отказ при попытке редактирования материалов сайта из административной панели Joomla.
Заключение
Давайте подведем итоги. В этой статье мы добавили новую группу пользователей Joomla, предоставили ей доступ к компоненту Remository и запретили изменять меню и материалы сайта. Таким образом мы получили группу менеджеров файлового архива, которые могут беспрепятственно заходить в административную панели и управлять файловым архивом, реализованным посредством компонента Remository.
В принципе осталась еще одна мелочь, которую я не описал в статье, бо это не интересно: скрыть лишние кнопки на главной странице панели управления Joomla. Если общественность потребует, я опишу это в следующей статье.
Желаю успешных экспериментов, жду отзывов и вопросов на форуме!