Как известно, в Joomla существует фиксированный набор групп пользователей с заранее предопределенными правами на различные функции системы. Однако при создании сайтов возникают задачи, которые требуют наличия дополнительных групп пользователей со специфическими правами. Наиболее распространенным решением этой задачи является использование компонента-хака JACLPlus, но не всегда это уместно. На прошлой неделе мне пришлось решать подобную задачу и в этой статье я расскажу как это было реализовано.
Постановка задачи
Необходимо добавить в Joomla дополнительную группу пользователей, которая обладала бы следующими правами:
Доступ к административной панели
Доступ к заданному компоненту (для простоты выберем компонент Remository)
Не имела бы доступа к остальным разделам административной панели Joomla
Как мы видим, наиболее похожая группа пользователей это Manager, так как в ней есть и доступ в административную панель Joomla, и нет доступа к большинству административных функций (управление пользователями, расширениями и т.д.). Чего же нам нехватает? Да, в принципе, самой малости:
Нет доступа к компоненту Remository)
Есть доступ к Медиа менеджеру, Меню и Материалам
Для решения нашей задачи можно пойти двумя путями: изменить права группы Manager и добавить новую группу, похожую частично на Manager, но с урезанными правами. Первая задача достаточно простая, но не столь интересная в реализации. Эту тему уже не раз обсуждали на форуме, и решения найти не проблема. Я же хочу рассказать о том, как создать дополнительную группу, и как ее наделить нужными правами для решения нашей задачи.
Перед началом модификаций рекомендую создать резервную копию изменяемых файлов и базы данных. Если у вас вдруг что-то не получится наличие резервной копии позволит вам откатить изменения и восстановить работоспособность сайта.
Добавление новой группы пользователей Joomla
Как известно, в Joomla существует следующая иерархия пользователей:
ROOT
| — USERS
| — PublicFrontend
| — - — Registered
| — - — - Author
| — - — - — Editor
| — - — - — - Publisher
| — - Public Backend
| — - — Manager
| — - — - Administrator
| — - — - — Super Administrator
Таким образом, нам надо добавить группу пользователей (назовем ее DownloadsManager) в качестве дочерней для Public Backend, чтобы дерево групп пользователей приняло вид:
ROOT
| — USERS
| — PublicFrontend
| — - — Registered
| — - — - Author
| — - — - — Editor
| — - — - — - Publisher
| — - Public Backend
| — - — Manager
| — - — - Administrator
| — - — - — Super Administrator
| — - — DownloadsManager
Информация о существующих группах пользователей и их иерархии располагается в таблице 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 не является дочерней даже для Суперадминистратора, поэтому создать такого пользователя не получается. Чтобы это разрешить, мы сделаем небольшую модификацию, которая на безопасность не особо повлияет:
Откроем файл /administrator/components/com_user/admin.user.php
Найдем в нем строчку:
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 необходимо в этом файле, после строчки:
$this->_mos_add_acl( ‘administration’, ‘login’, ‘users’, ‘manager’, null, null );
добавить еще одну:
$this->_mos_add_acl( ‘administration’, ‘login’, ‘users’, ‘downloadsmanager’, null, null );
Так, теперь пользователи этой группы могут беспрепятственно входить в административную панель Joomla и фактически равны по правам пользователям группы Manager, однако пока не имеют доступа к компоненту Remository и могут редактировать материалы сайта.
Предоставление доступа к компоненту Remository
Для того, чтобы пользователи группы DownloadsManager могли работать с компонентом Remository необходимо, чтобы во-первых пользователи этой группы видели меню Компоненты и, во-вторых, чтобы они имели доступ к самому компоненту.
Для начала, добавим в /includes/gacl.class.php права на компонент. Для этого найдем строчку:
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘manager’, ‘components’, ‘com_media’ );
и добавим после нее:
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘downloadsmanager’, ‘components’, ‘com_remository’ );
Все, пользователи группы DownloadsManager будут иметь доступ к компоненту Remository. Займемся теперь доступностью пункта меню Компоненты
Настройка видимости пунктов меню административной панели Joomla
Главное меню административной панели Joomla выводится модулем mod_fullmenu, расположенном в папке /administrator/modules. Его мы и будем править, чтобы настроить видимость пунктов в зависимости от прав пользователя.
В файле /administrator/modules/mod_fullmenu.php находим строчку:
$canManageUsers = $acl->acl_check( ‘administration’, ‘manage’, ‘users’, $usertype, ‘components’, ‘com_users’ );
и добавляем после нее:
$canEditRemository = $acl->acl_check( ‘administration’, ‘edit’, ‘users’, $usertype, ‘components’, ‘com_remository’ );
$canEditContent = $acl->acl_check( ‘administration’, ‘edit’, ‘users’, $usertype, ‘components’, ‘com_content’ );
$canEditMenus = $acl->acl_check( ‘administration’, ‘edit’, ‘users’, $usertype, ‘components’, ‘com_menus’ );
Затем чуть ниже заменяем
if ($installComponents) {
на
if ($installComponents || $canEditRemository) {
Далее после строчки
// Content Sub-Menu
добавляем
if ($canEditContent) {
и чуть ниже, перед строчкой
// Components Sub-Menu
вставляем
}
И теперь отключим отображение пункта меню Медиа-менеджер. Заменяем строчку:
['','Media Manager','index2.php?option=com_media',null,'Manage Media Files'],
на
['','Media Manager','index2.php?option=com_media',null,'Manage Media Files'],
Чтобы скрыть лишние пункты меню сделаем еще несколько модификаций данного модуля. После строчки:
$manageMenuMan = $acl->acl_check( ‘administration’, ‘manage’, ‘users’, $usertype, ‘components’, ‘com_menumanager’ );
добавим:
$manageMenu = $acl->acl_check( ‘administration’, ‘manage’, ‘users’, $usertype, ‘components’, ‘com_menus’ );
Все, теперь пользователей группы DownloadsManager станет доступно меню Компоненты, в котором будет только один подпункт — Remository. Другие компоненты будут недоступны (за исключением com_content, com_menus и com_typedcontent).
Мы уже очень близки к поставленной цели: у нас есть новая группа, пользователи этой группы имеют доступ к административной панели Joomla и в ней могут работать с административной частью компонента Remostitory. Кроме того, пользователь уже не видит лишних пунктов меню (Медиа-менеджер, Меню, Материалы). Дело за малым: закрыть реальный доступ к редактированию меню и материалов сайта.
Запрет группе доступа к редактированию меню и материалов
Сначала немного расширим список прав групп, чтобы явно предоставить права на Меню и Материалы пользователям групп Manager, Administrator и Super administrator. Для этого в файле /includes/gacl.class.php после строчки:
//array( ‘administration’, ‘edit’, ‘users’, ‘manager’, ‘modules’, ‘all’ );
добавим:
// access to com_menus
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘super administrator’, ‘components’, ‘com_menus’ );
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘administrator’, ‘components’, ‘com_menus’ );
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘manager’, ‘components’, ‘com_menus’ );
// access to com_content
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘super administrator’, ‘components’, ‘com_content’ );
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘administrator’, ‘components’, ‘com_content’ );
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘manager’, ‘components’, ‘com_content’ );
// access to com_typecontent
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘super administrator’, ‘components’, ‘com_typedcontent’ );
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘administrator’, ‘components’, ‘com_typedcontent’ );
$this->_mos_add_acl( ‘administration’, ‘edit’, ‘users’, ‘manager’, ‘components’, ‘com_typedcontent’ );
Теперь, необходимо отредактировать файлы этих компонентов, чтобы запретить доступ к ним тем группам, у которых права явно не прописаны. Для этого, выполним следующие модификации:
Открываем файл /administrator/components/com_menus/admin.menus.php и сразу после строчки:
defined( ‘_VALID_MOS’ ) or die( ‘Restricted access’ );
добавляем проверку прав:
if (!($acl->acl_check( ‘administration’, ‘edit’, ‘users’, $my->usertype, ‘components’, ‘all’ )
| $acl->acl_check( ‘administration’, ‘edit’, ‘users’, $my->usertype, ‘components’, ‘com_menus’ ))) {
mosRedirect( ‘index2.php’, _NOT_AUTH );
}
Открываем файл /administrator/components/com_content/admin.content.php и сразу после строчки:
defined( ‘_VALID_MOS’ ) or die( ‘Restricted access’ );
добавляем проверку прав:
if (!($acl->acl_check( ‘administration’, ‘edit’, ‘users’, $my->usertype, ‘components’, ‘all’ )
| $acl->acl_check( ‘administration’, ‘edit’, ‘users’, $my->usertype, ‘components’, ‘com_content’ ))) {
mosRedirect( ‘index2.php’, _NOT_AUTH );
}
Открываем файл /administrator/components/com_typedcontent/admin.typedcontent.php и сразу после строчки:
defined( ‘_VALID_MOS’ ) or die( ‘Restricted access’ );
добавляем проверку прав:
if (!($acl->acl_check( ‘administration’, ‘edit’, ‘users’, $my->usertype, ‘components’, ‘all’ )
| $acl->acl_check( ‘administration’, ‘edit’, ‘users’, $my->usertype, ‘components’, ‘com_typedcontent’ ))) {
mosRedirect( ‘index2.php’, _NOT_AUTH );
}
Все! После вставки данных проверок, пользователи группы DownloadsManager гарантированно получат отказ при попытке редактирования материалов сайта из административной панели Joomla.
Заключение
Давайте подведем итоги. В этой статье мы добавили новую группу пользователей Joomla, предоставили ей доступ к компоненту Remository и запретили изменять меню и материалы сайта. Таким образом мы получили группу менеджеров файлового архива, которые могут беспрепятственно заходить в административную панели и управлять файловым архивом, реализованным посредством компонента Remository.
В принципе осталась еще одна мелочь, которую я не описал в статье, бо это не интересно: скрыть лишние кнопки на главной странице панели управления Joomla. Если общественность потребует, я опишу это в следующей статье.
Теги:
|