Comment attribuer des autorisations aux rôles par programme?

26

J'ai des autorisations que j'aimerais attribuer à certains rôles par programmation pour une installation plus facile.

Étant donné que j'installe le module et que je crée à la fois des autorisations et des rôles, je n'ai pas d'ID de rôle, où je veux définir les autorisations. Jusqu'à présent, je n'ai trouvé que des moyens d' attribuer par programmation des rôles nécessitant l'ID de rôle.

Je me demande si je pourrais en quelque sorte rechercher les rôles avec leur nom (chaîne), récupérer l'ID de rôle puis attribuer une autorisation. Cela ne me semble pas juste.

vogelsang
la source
La table des autorisations utilise l'ID de rôle, pas le nom de rôle. Vous devez obtenir l'ID de rôle, puis ajouter l'autorisation à l'aide de cet ID. La table des autorisations a alors besoin de la chaîne de l'autorisation et du nom du module qui l'implémente (au moins sur Drupal 7); Je ne sais pas si le nom du module est vraiment utilisé de quelque façon que ce soit.
kiamlaluno
Y a-t-il quelque chose de spécifique que vous ne comprenez pas sur le code que vous devez utiliser? Quel code avez-vous utilisé? Montrer votre code serait utile; cela aiderait qui répond à suggérer ce que vous devez faire (par exemple, signaler ce qui ne va pas dans votre code).
kiamlaluno
Merci d'avoir répondu. Je pense que je dois rechercher les identifiants dans la base de données. Cela ne devrait pas être si difficile.
vogelsang

Réponses:

1

Le module Fonctionnalités le fait très bien, vous permettant d'exporter des rôles et des autorisations (et beaucoup d'autres choses) d'un seul coup:

http://drupal.org/project/features

Mais si vous souhaitez lancer votre propre API d'autorisation d'extraction:

http://drupal.org/project/permissions_api

krlucas
la source
2
Le problème est que vous ne connaissez pas l'ID de rôle lorsque vous utilisez des fonctionnalités, car elles sont attribuées lorsque vous installez votre fonctionnalité. Par conséquent, vous devez trouver les ID pour attribuer les autorisations. C'est probablement juste une recherche dans la base de données.
vogelsang
24

Les fonctionnalités sont assez pratiques pour des trucs comme ça. Cependant, si vous devez créer des rôles et ajouter des autorisations par programme, vous n'avez pas besoin de fouiller dans la base de données par vous-même.

Lorsque vous créez un nouveau rôle d'utilisateur avec user_role_save(), il mettra à jour l'objet que vous avez transmis avec le nouvel ID de rôle d'utilisateur qui a été attribué. Vous pouvez en voir un exemple dans la standard_install()fonction du profil d'installation 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')));

Cet exemple montre que vous pouvez créer un nouveau rôle d'utilisateur, puis accéder à sa ridpropriété, qui a été remplie par user_role_save(). Il montre également comment ajouter des autorisations à ce rôle avec user_role_grant_permissions(). Dans ce cas, il accorde au rôle «administrateur» toutes les autorisations disponibles.

Si vous devez obtenir l'ID d'un rôle d'utilisateur créé par quelqu'un d'autre, vous pouvez utiliser user_role_load_by_name()pour obtenir l'objet pour ce rôle d'utilisateur. Ensuite, il vous suffit de saisir l'identifiant avec $role->rid.

Chaulky
la source
2
C'est bien pour accorder / révoquer plusieurs autorisations à la fois: api.drupal.org/api/drupal/modules%21user%21user.module/function/…
Brian Wood
20

Je voudrais ajouter un exemple de code plus proche de la question d'origine sur la façon d'attribuer des autorisations aux rôles existants par programme.

Vous pouvez rechercher les rôles avec leur nom, récupérer l'ID de rôle, puis attribuer les autorisations comme suit (par exemple dans une implémentation 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
la source