Використання ACL API для створення списків контролю доступами

21.05.2013
ACL API Utilization For Creating Access Control Lists
Автор:

Інколи при створенні сайтів виникає необхідність реалізувати правила управління контролем доступу, котрі не відповідають жодним критеріям. Ви, приміром, хочете створити дозволи для окремих нод одного типу матеріалу, або дозвіл на перегляд певного матеріалу потрібно надати окремим користувачам із одинаковою роллю. Для реалізації цього функціоналу використовують 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 є дуже корисним, особливо, коли йдеться про побудову власних списків контролю доступами.

2 votes, Рейтинг: 4.5

Також по темі

2

Для початку кілька слів про бібліотеку. pChart – це набір класів для побудови графіків, діаграм і т.п. в php. 

3

Наша компанія дуже часто використовує модуль Panels при створенні сайтів. Хоча це рішення додає чимало...

4

 Із розвитком соціальних мереж замовники все частіше хочуть інтегрувати сайт з Facebook, Twitter, Google+ і т.д. На одному з проектів, потрібно було, реалізувати кроспостінг у...

5

Бувають випадки, коли потрібно перенести якісь зміни в базі з одного сайту на інший, а переливати всю базу процес досить проблематичний, а інколи неможливий в силу появи на ньому нових матеріалів...

Subscribe to our blog updates