Как работает node_grants
Опубликовано пт, 14/08/2015 - 12:38
Каждый раз сталкиваясь с 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() в модулях).
Дополнительная информация по статье
- https://api.drupal.org/api/drupal/modules!node!node.api.php/function/hook_node_grants/7 - описание hook_node_grants() на официальном сайте.
- https://api.drupal.org/api/drupal/modules!node!node.api.php/function/hook_node_access_records/7 - описание hook_node_access_records() на официальном сайте.
2 Комментария
Денис - вт, 25/08/2015 - 22:46
$grants['MYMODULE_REALM'] -
$grants['MYMODULE_REALM'] - это же константа, тогда кавычки не нужны :)
nightdevel - вт, 25/08/2015 - 23:59
это не константа, а строка
это не константа, а строка (например, имя кастомного модуля). Пропустил кавычки, видимо, поэтому сложилось впечатление, что это константа - исправил.