Таблица node_access
Таблица node_access является ключевым компонентом системы управления доступом Drupal. Она хранит записи, которые определяют, какая роль пользователя имеет какие права (view, update, delete) к каким материалам (нодам) при определенных условиях. Модули (такие как node, content_moderation, organic_groups) могут создавать свои записи в этой таблице для реализации сложных моделей прав доступа.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
nid |
int |
Идентификатор ноды (материала), к которой применяется правило доступа. Внешний ключ для таблицы node. Может быть 0, что означает "все ноды".
|
langcode |
varchar(12) |
Код языка, для которого применяется правило. Пустая строка означает, что правило применяется ко всем языкам. |
fallback |
int |
Флаг резервного правила. Если установлен в 1, это правило будет использоваться, если для данного языка (langcode) не найдено более конкретного правила. Обычно для каждого модуля, добавляющего права, создается одно резервное правило с nid = 0.
|
gid |
int |
Идентификатор группы доступа (Grant ID). Определяет, к какой группе (роли, аудитории, команде) применяется это правило. Например, ID роли пользователя или ID группы в модуле Organic Groups. |
realm |
varchar(255) |
"Сфера" или пространство, в котором действует правило. Обычно это имя модуля, который создал запись (например, all, content_moderation, og). Помогает различным модулям не конфликтовать друг с другом.
|
grant_view |
int |
Право на просмотр ноды. 1 - разрешено, 0 - запрещено.
|
grant_update |
int |
Право на обновление (редактирование) ноды. 1 - разрешено, 0 - запрещено.
|
grant_delete |
int |
Право на удаление ноды. 1 - разрешено, 0 - запрещено.
|
Как это работает
Когда пользователь пытается получить доступ к ноде (просмотреть, отредактировать, удалить), Drupal запрашивает таблицу node_access, чтобы определить, разрешено ли данное действие. Запрос учитывает nid материала, язык, роли пользователя (которые сопоставляются с gid) и сферу (realm).
Правила доступа могут быть как разрешающими, так и запрещающими. Drupal использует логику "разрешить, если хотя бы одно правило разрешает". Если для действия (например, grant_view) найдена хотя бы одна запись со значением 1, и пользователь соответствует условиям этой записи, доступ будет предоставлен.
Модули могут реализовывать хук hook_node_access_records для добавления своих записей в таблицу при сохранении ноды и хук hook_node_grants для сообщения ядру Drupal, к каким группам доступа (gid) принадлежит текущий пользователь в определенной сфере (realm).
При изменении прав доступа к ноде или при установке новых модулей, влияющих на доступ, может потребоваться перестроение прав доступа через административный интерфейс (Администрирование > Конфигурация > Разработка > Производительность) или с помощью Drush-команды drush cr или drush node-access-rebuild.
Пример SQL-запроса
Посмотреть все правила доступа для конкретной ноды можно следующим запросом:
SELECT na.*, n.title as node_title
FROM node_access na
LEFT JOIN node n ON (na.nid = n.nid)
WHERE na.nid = 42
ORDER BY na.realm, na.gid;
Смотрите также
-
таблицу
node,
которая хранит основные данные материалов (нод) -
таблицу
users,
которая содержит данные пользователей системы -
таблицу
node_field_data,
которая хранит данные полей нод на разных языках -
таблицу
url_alias,
которая управляет ЧПУ для материалов