Joomla! Access Control Plugin - плагін для розподілу рівнів доступу в Joomla!
11.02.2008, 05:53 | Новини розширень Joomla! | Денис Носов
Як Ви можливо знаєте, що Joomla 1.5 не дає гранульованого рівня доступу, хоча ACL повинно бути доспупним у версії Joomla 1.6, але це поки що стоїть під питанням. У цей час Роберто Алой (Roberto Aloi – a.k.a. Prof3ta) вирішив цю задачу для Joomla 1.5, написавши простий плагін.
Це доволі простий плагін, який повинен вирішити деякі базові рівні контролю доступа Joomla 1.5.х – компоненти, модулі і т.д.
Якщо Вам необхідно розбити користувачів по групам (наприклад, студентів та викладачів), даючи їм конкретні рівні доступу як в Адміністративній частині, так і в Фронтальній, то у цьому Вам допоможе саме Joomla! Access Control Plugin.
Як використовувати Joomla! Access Control Plugin?
Розглянемо наступну специфікацію, яка буде використовуватися:
- ACO (Access Control Object) – підтримка контролю доступом (операції, які доступні або недоступні в межах Компоненту);
- ARO (Access Request Objects) – підтримка контролю запитів (Ваші Користувачі);
- AXO (Access eXtension Objects) – підтримка контролю доступу до Розширень.
Першим кроком буде встановлення плагіну через Менеджер Встановлення.
Далі Ви повинні додати наступні таблиці до бази даних:
- #__acl_acos
- #__acl_aro_groups
- #__acl_aro_groups_acos_map
- #__acl_aros_aro_groups_map
У даний момент, відсутній будь-який графічний інтерфей, щоб можна було керувати цими таблицями, таким чином Ви повинні керувати базою даних вручну!
Також Joomla не пропонує можливість виконувати SQL-запити, таким чином необхідно їх виконати вручну. Для цього можете використати цей вихідний SQL-файл (prof3taacl.sql.txt), який необхідно перейменувати з розширенням .sql. Або Ви можете, використовуючи MyPHPAdmin виконати наступний запит:
DROP TABLE IF EXISTS `#__acl_aro_groups_acos_map`; DROP TABLE IF EXISTS `#__acl_aros_aro_groups_map`; DROP TABLE IF EXISTS `#__acl_aro_groups`; DROP TABLE IF EXISTS `#__acl_acos`; CREATE TABLE IF NOT EXISTS `#__acl_acos` ( `id` int(11) NOT NULL auto_increment, `axo_id` int(11) NOT NULL, `aco_name` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `axo_id` (`axo_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `#__acl_aro_groups` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `#__acl_aro_groups_acos_map` ( `aro_group_id` int(11) NOT NULL, `aco_id` int(11) NOT NULL, KEY `aro_group_id` (`aro_group_id`), KEY `aco_id` (`aco_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `#__acl_aros_aro_groups_map` ( `aro_id` int(11) NOT NULL, `aro_group_id` int(11) NOT NULL, KEY `aro_id` (`aro_id`), KEY `aro_group_id` (`aro_group_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Перша таблиц (#__acl_acos) містить так званий ACO (див. специфікацію). Таблиця створена таким чином:
id | axo_id | aco_name --------------------------- 1 | 37 | giveGrade 2 | 37 | receiveGrade
де:
- id – ACO індифікатор;
- axo_id – component_id компонента;
- aco_name – символічна назва для дії, яку Користувач може виконати в межах Компонента.
Наступна таблиця (* __ acl_aro_groups) представляє групи Користувачів. Таблиця створена таким чином:
id | name ------------------- 1 | студенти 2 | викладачі
Третя таблиця (* __ acl_aro_groups_acos_map) містить всі співвідношення між групами ARO і ACO. Таблиця створена таким чином:
aro_group_id | aco_id --------------------------- 1 | 1 1 | 1
У даному випадку, студенти можуть отримати оцінку, а викладачі можуть виставити її.
Остання таблиця (* __ acl_aros_aro_groups_map) містить всі співвідношення, між ARO (Joomla! зареєстрованими Користувачами) та їх групами ARO. Таблиця створена таким чином:
aro_id | aro_group_id --------------------------- 65 | 1 66 | 2
Де 65 – зареєстрований студент, а 66 – зареєстрований викладач.
Теперь, одна річ, про яку Ви повинні подбати – створити таблиці відповідно до ваших вимог.
Розробник збирається написати графічний інтерфейс для простого використання.
Якщо Ви хочете керувати доступом для одного або більше компонентів, Ви можете використовувати наступну функцію:
$mainframe->triggerEvent( 'onAccessingSafeComponent', array($userId, $acoId));
А ось приклад, як можна використовувати цю функцію:
<?php $user =& JFactory::getUser(); $userId = $user->id; // Import the user plugin group JPluginHelper::importPlugin('user'); // Let's fire the onAccessingSafeComponent event $canGiveGrades = $mainframe->triggerEvent( 'onAccessingSafeComponent', array($userId, '1')); if ($canGiveGrades[0] == '1'){ // CODE TO GIVE GRADES GOES HERE } ?>
Roberto Aloi: prof3ta.netsons.org