Таблица user__roles
Таблица user__roles является частью системы полей Drupal и предназначена для хранения связи между пользователями (user) и ролями (user_roles). Каждая запись в этой таблице представляет собой назначение конкретной роли конкретному пользователю.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
bundle |
varchar(128) |
Тип сущности, для которой определено поле. Всегда имеет значение user. |
deleted |
tinyint |
Флаг удаления записи: 0 - запись активна, 1 - запись удалена.
|
entity_id |
int |
Идентификатор пользователя (uid). Внешний ключ к таблице users.
|
revision_id |
int |
Идентификатор ревизии пользователя. Ссылается на users_field_data.vid.
|
langcode |
varchar(32) |
Код языка, для которого предназначены данные. |
delta |
int |
Порядковый номер значения в списке ролей для данного пользователя. |
roles_target_id |
varchar(255) |
Идентификатор роли (машинное имя). Внешний ключ к таблице user_roles (поле id).
|
Как это работает
Drupal использует систему ролей и разрешений для управления доступом. Когда пользователю назначается роль (например, "Администратор", "Редактор", "Аутентифицированный пользователь"), в таблицу user__roles добавляется новая запись. Поле entity_id содержит ID пользователя, а поле roles_target_id содержит машинное имя роли.
Один пользователь может иметь несколько ролей, поэтому для одного entity_id может существовать несколько записей с разными значениями roles_target_id и уникальным значением delta для каждого назначения.
При проверке прав доступа система Drupal собирает все роли текущего пользователя, запрашивая их из этой таблицы, а затем объединяет все разрешения, связанные с этими ролями из таблицы user_roles.
Важно отметить, что таблица user__roles не хранит базовые роли, которые есть у каждого пользователя по умолчанию: "Анонимный" (anonymous) и "Аутентифицированный" (authenticated). Эти роли обрабатываются системой на уровне логики и явно не записываются в эту таблицу для каждого пользователя.
Пример SQL-запроса
Получить список всех ролей для конкретного пользователя (например, с uid = 5) можно следующим запросом:
SELECT u.name as username, ur.roles_target_id as role_machine_name
FROM user__roles ur
INNER JOIN users_field_data u ON ur.entity_id = u.uid
WHERE ur.entity_id = 5
AND ur.deleted = 0;
Смотрите также
-
таблицу
users,
которая хранит основную информацию о пользователях -
таблицу
users_field_data,
которая содержит данные полей для пользователей -
таблицу
user_roles,
которая хранит определения ролей и их разрешения -
таблицу
node_access,
которая управляет доступом к материалам (нодам)