Блог

Иногда при создании сайтов возникает потребность в реализации таких правил контроля доступа, которые не отвечают ни одному из критериев. К примеру, Вам нужно создать разрешения для отдельных нод одного типа материала, или же разрешение на просмотр определенного материала нужно предоставить отдельным пользователям, у которых одинаковая роль. Чтобы реализовать подобный функционал, используют ACL API.

Итак, устанавливаем следующие модули:

ACL - модуль, который обеспечит нас апишкой для создания списков контроля доступами. У него отсутствует пользовательский интерфейс и используется он исключительно для потребностей других модулей.
Content Access - позволяет управлять разрешениями относительно типов материала.

pассмотрим несколько основных функций, используемых для роботы с 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 серьезно помогает, особенно в случаях, когда речь заходит о построении собственных списков контроля доступами.

Join the conversation
0 Comments