Как назначить разрешения для ролей программно?

26

У меня есть некоторые разрешения, которые я хотел бы назначить некоторым ролям программно для упрощения установки.

Поскольку я устанавливаю модуль и создаю разрешения и роли, у меня нет идентификаторов ролей, в которых я хочу установить разрешения. До сих пор я нашел только программные способы назначения ролей , для которых требуется идентификатор роли.

Интересно, смогу ли я как-нибудь найти роли по их имени (строке), получить идентификатор роли и назначить разрешение. Это просто не правильно.

Vogelsang
источник
В таблице разрешений используется идентификатор роли, а не имя роли. Вам нужно получить идентификатор роли, а затем добавить разрешение, используя этот идентификатор. Таблице разрешений затем нужна строка для разрешения и имя модуля, реализующего его (по крайней мере, в Drupal 7); Я не уверен, действительно ли используется имя модуля.
kiamlaluno
Есть ли что-то конкретное, что вы не понимаете в коде, который вы должны использовать? Какой код вы использовали? Показ вашего кода был бы полезен; это поможет тем, кто отвечает, подсказать, что вам нужно сделать (например, сообщить о том, что не так в вашем коде).
kiamlaluno
Спасибо за ответ. Я думаю, что я должен искать идентификаторы в базе данных. Это не должно быть так сложно.
Vogelsang

Ответы:

1

Модуль функций делает это довольно хорошо, позволяя вам экспортировать роли и разрешения (и множество других вещей) одним махом:

http://drupal.org/project/features

Но если вы хотите развернуть свой собственный API-интерфейс Permissions:

http://drupal.org/project/permissions_api

krlucas
источник
2
Проблема в том, что вы не знаете идентификатор роли при использовании функций, поскольку они назначаются при установке вашей функции. Поэтому вам нужно как-то найти идентификаторы, чтобы назначить разрешения. Это, вероятно, просто поиск в базе данных.
Vogelsang
24

Особенности довольно удобны для таких вещей, как это. Однако, если вам нужно создавать роли и добавлять разрешения программно, вам не нужно копаться в базе данных самостоятельно.

Когда вы создаете новую пользовательскую роль с помощью user_role_save(), она обновит переданный вами объект новым назначенным идентификатором роли пользователя. Вы можете увидеть пример этого в standard_install()функции в стандартном профиле установки.

$admin_role = new stdClass();
$admin_role->name = 'administrator';
...
user_role_save($admin_role);
user_role_grant_permissions($admin_role->rid, array_keys(module_invoke_all('permission')));

Этот пример показывает, что вы можете создать новую роль пользователя, а затем получить доступ к ее ridсвойству, которое было заполнено user_role_save(). Также показано, как добавить разрешения для этой роли с помощью user_role_grant_permissions(). В этом случае он предоставляет роли «администратор» все доступные разрешения.

Если вам нужно получить идентификатор роли пользователя, созданной кем-то другим, вы можете использовать user_role_load_by_name()объект для этой роли пользователя. Тогда вы просто захватите идентификатор с $role->rid.

Chaulky
источник
2
Это удобно
Брайан Вуд,
20

Я хотел бы добавить пример кода, который ближе к первоначальному вопросу о том, как программно назначать разрешения для существующих ролей.

Вы можете искать роли по их имени, получать идентификатор роли и затем назначать разрешения следующим образом (например, в реализации hook_update):

function custommodule_update_7001() {
  $permissions = array('view my custom entity');
  foreach(array('anonymous user', 'authenticated user') as $role_name) {
    $role = user_role_load_by_name($role_name);
    user_role_grant_permissions($role->rid, $permissions);
  }
}
batigolix
источник