Как работает node_grants

Как работает node_grants

Каждый раз сталкиваясь с grants, приходилось снова и снова вникать в суть реализации. Ну никак не мог запомнить как это все дело работает! И в этом я, наверное, не одинок. Для всех, кто подзабыл или не помнит как работает механизм грантов, предназначена эта статья. Итак начнем разбираться (вспоминать).

Два важных хука, которые необходимо запомнить:

  • hook_node_grants() - хук, отвечающий непосредственно за то, давать определенному пользователю пермишены или нет.
  • hook_node_access_records() - позволяет создавать гранты для нод (т.е. пермишены на просмотр, редактирование и удаление). Запись в таблице node_access будет создана при сохранении ноды.

Хук hook_node_grants() будет вызван при манипуляциях с нодой (просмотр, редактирование и удаление) уже непосредственно для конкретного пользователя, который выполняет вышеперечисленные действия. Если мы желаем дать пользователю права, то мы возвращаем грант ID, который был указан в hook_node_access_records(). Пример:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function MYMODULE_node_access_records($node) {
   $grants[] = array(
      // Тут может быть любое число, абсолютно не важно. Число должно быть большим либо
      // равным нулю и уникальным в пределах одной области (realm).
      'gid' => 555,
      'realm' => 'MYMODULE_REALM',
      // Определяем, что разрешаем делать. В данном случае - просмотр и редактирование.
      'grant_view' => 1,
      'grant_update' => 1,
      'grant_delete' => 0,
      'priority' => 0,
    );
  }
  return $grants;
}
 
function MYMODULE_node_grants($account, $op) {
  // Условия, по которым даем право конкретному пользователю.
  // Число должно совпадать с тем, что указано в hook_node_access_records() - это ВАЖНО(!)
  $grants['MYMODULE_REALM'][] = 555;
  return $grants;
}

Стоит отметить, что hook_node_grants() вызывается после hook_node_access() и является более детальной настройкой пермишенов для ноды. Для суперюзера, а также для пользователей, обладающих правами "bypass node access" hook_node_grants() вызван не будет (исключение составляют, конечно, случаи прямого вызова hook_node_grants() в модулях).

Дополнительная информация по статье

  1. https://api.drupal.org/api/drupal/modules!node!node.api.php/function/hook_node_grants/7 - описание hook_node_grants() на официальном сайте.
  2. https://api.drupal.org/api/drupal/modules!node!node.api.php/function/hook_node_access_records/7 - описание hook_node_access_records() на официальном сайте.

2 Комментария

Аватар пользователя nightdevel

это не константа, а строка

это не константа, а строка (например, имя кастомного модуля). Пропустил кавычки, видимо, поэтому сложилось впечатление, что это константа - исправил.