Інколи при створенні сайтів виникає необхідність реалізувати правила управління контролем доступу, котрі не відповідають жодним критеріям. Ви, приміром, хочете створити дозволи для окремих нод одного типу матеріалу, або дозвіл на перегляд певного матеріалу потрібно надати окремим користувачам із одинаковою роллю. Для реалізації цього функціоналу використовують ACL API.
Отже, встановимо наступні модулі:
ACL - модуль, який забезпечує нас апішкою для створення списків контролю доступів. Він не має користувацького інтерфейсу і використовується виключно лише для потреб інших модулів.
Content Access - дозволяє керувати дозволами відповідно до типів матеріалу.
Розглянемо декілька основних функцій, що придатні для роботи з ACL. Щоб створити новий список контролю доступами використовується функція:
acl_create_acl($module, $name = NULL, $number = NULL)
Як бачимо, функція приймає три аргументи - ім’я модуля, ім’я створюваного АCL і його номер. Повертає вона ідентифікатор створеного списку контролю доступами. Додати матеріал до цього списку можна з допомогою функції:
acl_node_add_acl($nid, $acl_id, $view, $update, $delete, $priority = 0)
Принцип її роботи наступний: для потрібного матеріалу $nid ми надаємо або забороняємо відповідні доступи (перегляд, редагування, видалення), скориставшись раніше створеним ACL ($acl_id). А щоб добавити користувача до створеного списку, виконуємо наступне:
acl_add_user($acl_id, $uid)
де $uid - ідентифікатор користувача.
Отже, ми розглянули декілька основних функцій для створення нового ACL. Зараз пропонуєм перейти до практики, аби закріпити знання. Скористаємось прикладом, в якому надамо дозвіл на перегляд конкретного матеріалу ($nid) тільки одному користувачу ($uid) з ролі "Customer". Для початку, використовуючи модуль Content access, встановимо заборону перегляду потрібного типу матеріалу для нашої ролі. А далі, щоб надати дозвіл для конкретного матеріалу вибраному користувачу з ролі "Customer", пишемо наступне:
// Create a new ACL. $acl_id = acl_create_acl('your_module_name', 'your_access_name'); // Provide access control to a node based upon an ACL id. acl_node_add_acl($nid, $acl_id, 1, 0, 0, 0); // Add the specified UID to an ACL. acl_add_user($acl_id, $uid); // Node access grants for rebuilding. node_access_needs_rebuild(TRUE);
В даному прикладі ми використали функцію node_access_needs_rebuild для того, щоб перебудувати дозволи. Також, аби задумане зафункціонувало, необхідно переконатися, чи береться до уваги система дозволів матеріалів drupal. Тому добавляємо наступне:
/** * Implementation of ACL hook hook_enabled() */ function id_acl_enabled() { return !id_acl_disabling(); } /** * Implements hook_disable(). */ function id_acl_disable() { id_acl_disabling(TRUE); } /** * Remembers if we have disabled access. */ function id_acl_disabling($set = NULL) { static $disabling = FALSE; if ($set) { $disabling = $set; } return $disabling; }
Тепер у нас матеріали, для яких було створено список, не можуть переглянути всі користувачі з ролю "Customer", а лише ті, яким ми надали на це дозвіл.
Разом із тим, існують відповідні функції, які видаляють користувачів та матеріали із ACL та виконують видалення самого списку. Давайте розглянемо їх:
acl_delete_acl($acl_id) - видаляє ACL за його ідентифікатором.
acl_node_clear_acls($nid, $module) - видаляє повністю всі списки ACL з матеріалу.
acl_node_remove_acl($nid, $acl_id) - видаляє вказаний матеріал з ACL.
acl_remove_user($acl_id, $uid) - видаляє користувача з ACL.
Як бачимо, знання ACL є дуже корисним, особливо, коли йдеться про побудову власних списків контролю доступами.