Добавление новой группы пользователей Joomla 1.0

  • Среда, 25 июля 2007

Как известно, в Joomla 1.0 существует фиксированный набор групп пользователей с заранее предопределенными правами на различные функции системы. Однако при создании сайтов возникают задачи, которые требуют наличия дополнительных групп пользователей со специфическими правами. Наиболее распространенным решением этой задачи является использование компонента-хака 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. Если общественность потребует, я опишу это в следующей статье.

Желаю успешных экспериментов, жду отзывов и вопросов на форуме!

Joomla!® CMS — пожалуй, лучшая система управления контентом с открытым исходным кодом

Логотип Joomla

Joomla! — это больше, чем просто программное обеспечение, это люди, включающие разработчиков, дизайнеров, системных администраторов, переводчиков, копирайтеров, и, что самое главное — простых пользователей.

Мы рады пригласить вас в ряды нашего сообщества!

Свернуть

Коротко о главном в Joomla

Новости портала

Новое в блогах

Видео

Форум о Joomla