Таблица users_roles
Таблица users_roles является технической связующей таблицей в Drupal, которая реализует отношение многие-ко-многим между таблицами users и role. Каждая запись в этой таблице означает, что пользователю с определённым uid назначена роль с определённым rid.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
uid |
int |
Идентификатор пользователя. Внешний ключ, ссылающийся на поле uid в таблице users. Вместе с rid образует первичный ключ таблицы.
|
rid |
int |
Идентификатор роли. Внешний ключ, ссылающийся на поле rid в таблице role. Вместе с uid образует первичный ключ таблицы.
|
Как это работает
Drupal использует ролевую модель управления доступом (RBAC). Каждому пользователю может быть назначено несколько ролей, и каждой роли могут быть назначены определённые разрешения (permissions). Таблица users_roles хранит связи между этими двумя сущностями.
Когда пользователь сохраняется через административный интерфейс или программно, система проверяет, какие роли ему назначены, и обновляет записи в этой таблице. При проверке прав доступа Drupal собирает все роли пользователя (анонимная и аутентифицированные роли добавляются автоматически) и на их основе определяет совокупный набор разрешений.
Важно отметить, что таблица users_roles не содержит информации о самих ролях или пользователях - только связи между их идентификаторами. Данные о пользователях хранятся в users, а о ролях - в role.
Для оптимизации производительности Drupal кэширует разрешения пользователей, поэтому изменения в назначении ролей могут потребовать сброса кэша.
Пример SQL-запроса
Получить список всех ролей для конкретного пользователя (например, с uid = 5) можно следующим запросом:
SELECT u.name as username, r.name as role_name
FROM users_roles ur
INNER JOIN users u ON ur.uid = u.uid
INNER JOIN role r ON ur.rid = r.rid
WHERE ur.uid = 5;
Найти всех пользователей, имеющих определённую роль (например, роль 'administrator'):
SELECT u.uid, u.name
FROM users_roles ur
INNER JOIN users u ON ur.uid = u.uid
INNER JOIN role r ON ur.rid = r.rid
WHERE r.name = 'administrator';
Смотрите также
-
таблицу
users,
которая хранит основную информацию о пользователях -
таблицу
role,
которая содержит определения ролей -
таблицу
role_permission,
которая связывает роли с разрешениями -
таблицу
users_data,
которая хранит дополнительные данные пользователей