Безусловно, при разработке модулей серьезней HelloWorld Вам не обойтись без использования такой замечательной функциональности, как права доступа.
Использование прав доступа делает Ваш скрипт более гибким и управляемым, а также позволяет администраторам активировать для разных пользователей только необходимые им функции в Вашем модуле, отключая ненужные.
Давайте перейдем непосредственно к примерам...
Типы прав доступа
Все права доступа phpBB 3 разделяет на следующие категории:
- Администраторские
- Модераторские
- Пользовательские
- Общефорумные
На основе принадлежности к вышеприведенным группам и формируются префиксы в именах прав доступа.
Проверка прав доступа
Глобальные права
Давайте проверим, к примеру, может ли пользователь просматривать профайлы других пользователей:
if (!$auth->acl_get('u_viewprofile')) { trigger_error('NOT_AUTHORISED'); }
Если таких прав у него не будет, то он увидит сообщение об ошибке и скрипт остановит свое выполнение после trigger_error ().
Локальные права
Если Вы хотите проверить локальные права, к примеру, возможность читать сообщения в форуме с ID 5, используйте следующий код:
if (!$auth->acl_get('f_read', 5)) { trigger_error('NOT_AUTHORISED'); }
Список всех существующих прав Вы можете найти в таблице phpbb_acl_options в Вашей базе данных.
Добавление новых прав доступа
Обратите внимание: Идентификатор права доступа не должен содержать заглавных букв, иначе Вы столкнетесь с проблемой при попытке добавить модуль, который требует это право доступа.
Пример создания права доступа используя API-интерфейс phpBB 3. Запускайте этот код в установщике Вашего модуля:
< ?php /** * * Скрипт устанавливает права доступа в базу данных для модуля foo * @license http://opensource.org/licenses/gpl-license.php GNU Public License * */ /** * @ignore */ // Инициализируем страницу define('IN_PHPBB', true); define('IN_INSTALL', true); $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../'; $phpEx = substr(strrchr(__FILE__, '.'), 1); include($phpbb_root_path . 'common.' . $phpEx); // Запускаем сессию $user->session_begin(); $auth->acl($user->data); $user->setup('mods/foo'); // Подключаем класс $auth_admin для управления правами доступа include($phpbb_root_path . 'includes/acp/auth.' . $phpEx); $auth_admin = new auth_admin(); // Добавляем права доступа как локальные. // Но Вы можете сделать их и как глобальные. $auth_admin->acl_add_option(array( 'local' => array('f_survey_design', 'f_survey_takeforothers', 'f_survey_viewhiddenresults'), 'global' => array() )); $message = $user->lang['ADDED_PERMISSIONS'] . ' '; $message .= $user->lang['REMOVE_INSTALL']; trigger_error($message); ?>
Если по какой-то причине Вы не используете установщика для Вашего модуля, Вы можете создать страницу вроде install/install_permissions.php, которая будет содержать следующий код:
Затем добавьте следующую строчку в файл language/ru/mods/foo.php (или language/ru/common.php):
'ADDED_PERMISSIONS' => 'Права доступа были успешно добавлены в базу данных',
Использование SQL
Суровые челябинские программисты предпочитают вставлять права доступа напрямую в базу данных. Для этого Вам нужно выполнить запрос вроде следующего:
INSERT INTO phpbb_acl_options (auth_option, is_global, is_local, founder_only) VALUES ('u_view_foo', 1, 0, 0); INSERT INTO phpbb_acl_options (auth_option, is_global, is_local, founder_only) VALUES ('u_manage_foo', 1, 0, 0);
После выполнения SQL-запросов Вам нужно будет очистить кеш. Это можно сделать следующими способами:
- удалить cache/data_global.php и cache/data_global.php
- или выполнить $cache->destroy ('acl_options');
Языковые файлы
В любом случае настоятельно рекомендуется добавлять языковые переменные для только что созданных прав доступа. Для этого просто создайте файл permissions_foo.php в language/ru/mods. Впоследствие он автоматически подключится ядром phpBB 3.
Мы только что добавили категорию «foo» (будет отображаться как новая вкладка). Все права доступа, у которых 'cat' => 'foo' будут отображаться в нашей вкладке.
Созданное право доступа уже готово к использованию. Теперь узнаем, может ли пользователь просматривать модуль foo:
if (!$auth->acl_get('u_view_foo')) { trigger_error('NOT_AUTHORISED'); }
Вот мы и рассмотрели небольшие примеры для работы с правами доступа. Надеюсь, что Вы получили общее представление о том, как они работают в phpBB 3.
Материал подготовлен на основе соответствующей статьи в phpBB Development Wiki.
RSS