Настройка прав доступа к материалам в 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.
- Войдите, чтобы оставлять комментарии