Настройка прав доступа к материалам в Drupal

Для тонкой настройки прав доступа к материалам можно использовать возможности, которые уже заложенны в самом ядре Drupal.

Использование hook_node_access()

В Drupal 7 есть странный интересный хук hook_node_access(), который позволяет управлять доступом к материалам, при этом переопределяет контроль любых других модулей. Например, если мы вернем NODE_ACCESS_DENY, то мы закроем доступ к материалу независимо от того используется ли ещё какая-либо система контроля доступа.

Кроме того, hook_node_access() игнорируется Views, системой меню и любым другим запросом к контенту. Т.е. если мы имеем ссылку в меню или выводим ссылку на заголовок материала с помощью Views, то мы увидим эту ссылку. Отказ в доступе мы получим только на просмотре материала при переходе по этой ссылке. hook_node_access() так же не вызывается для пользователя с uid = 1, т.е. он имеет доступ ко всем материалам. Так что использовать hook_node_access() нужно очень осторожно.

В качестве примера запретим просмотр всех материалов типа page.

function mymodule_node_access($node, $op, $account) {
  if ($op == 'view' && $node->type == 'page') {
    return NODE_ACCESS_DENY;
  }
}

Использование «Grant API»

Правильным подходом будет использование системы «грантов». Ключевыми хуками здесь являются hook_node_access_records() и hook_node_grants(). Первый из которых выступает в качестве «замка», а второй в качестве «ключа».

Цель hook_node_access_records() — определить должна ли конкретная node быть заблокированной. Хук добавляет запись в таблицу {node_access} с указанными нами realm (область, в рамках которой пользователь должен обладать грант ID) и gid (грант ID). В качестве realm обычно используется название модуля, в котором объявляется хук, для более простой идентификации. Стоит отметить, что hook_node_access_records() вызывается только при сохранении node. 

Цель hook_node_grants() — информировать систему доступа к node, какие разрешения («ключи») есть у пользователя.

В качестве примера дадим полный достук к материалам типа page пользователю с ролью rid = 3.

function mymodule_node_access_records($node) {
  $grants = array();
  if ($node->type == 'page') {
    $grants[] = array(
      'realm' => 'mymodule',
      'gid' => 3,
      'grant_view' => TRUE,
      'grant_update' => TRUE,
      'grant_delete' => TRUE,
    );
  }
  return $grants;
}

function mymodule_node_grants($account, $op) {
  $grants = array();
  foreach ($account->roles as $rid => $role) {
    $grant_rids[] = $rid;
  }
  $grants['mymodule'] = $grant_rids;
  return $grants;
}

По мотивам статьи Drupal 7 Node Access: Grants, Locks, and Keys.

 

Smartweb

Мы надеемся данный материал будет для вас полезен. Спасибо что читаете нас!

Smartweb

«Smartweb» — это эффективная технология запуска, развития и продвижения бизнеса в интернете.

Заказать

Контакты

  • Smartweb
    Минск, Беларусь
  • Пн-Пт с 9:00 до 19:00 
  • +375 (29) 25-33-555
  • info@smartweb.by
Наша рассылка: