Як програмно призначити дозволи на ролі?


26

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

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

Цікаво, чи зможу я якось шукати ролі з їх іменем (рядком), отримати ідентифікатор ролі та призначити дозвіл. Це просто не вірно.


У таблиці дозволів використовується ідентифікатор ролі, а не ім'я ролі. Вам потрібно отримати ідентифікатор ролі, а потім додати дозвіл, використовуючи цей ідентифікатор. Тоді таблиці дозволів потрібна рядок для дозволу та назва модуля, що реалізує його (принаймні, на Drupal 7); Я не впевнений, чи справді ім’я модуля використовується якось.
kiamlaluno

Чи є щось конкретне, що ви не розумієте щодо коду, який слід використовувати? Який код ви використовували? Показати свій код було б корисно; це допоможе, хто відповість, підкаже, що вам потрібно зробити (наприклад, повідомити про те, що у вашому коді не так).
kiamlaluno

Дякую за відповідь. Я думаю, що я повинен шукати ідентифікатори в базі даних. Це не повинно бути таким важким.
vogelsang

Відповіді:


1

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

http://drupal.org/project/features

Але якщо ви хочете скасувати власний API перевірки дозволів:

http://drupal.org/project/permissions_api


2
Проблема полягає в тому, що ви не знаєте ідентифікатора ролей, коли використовуєте функції, оскільки вони призначаються під час встановлення функції. Тому вам потрібно знайти ідентифікатори якось, щоб призначити дозволи. Ймовірно, це просто пошук у базі даних.
vogelsang

24

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

Коли ви створюєте нову роль користувача user_role_save(), він оновлює об'єкт, який ви передали, новим ідентифікатором ролі користувача, який був призначений. Приклад цього можна побачити у standard_install()функції в профілі встановлення Standard.

$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.


2
Це добре для надання / відкликання декількох дозволів одночасно: api.drupal.org/api/drupal/modules%21user%21user.module/function/…
Brian Wood


20

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

Ви можете переглянути ролі з їх іменем, отримати ідентифікатор ролі та призначити дозволи наступним чином (наприклад, у реалізації_загальнення_контроля):

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);
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.