¿Cómo asignar permisos a roles mediante programación?

26

Tengo algunos permisos que me gustaría asignar a algunos roles mediante programación para facilitar la instalación.

Como estoy instalando el módulo y creando permisos y roles, no tengo los identificadores de roles, donde quiero establecer los permisos. Hasta ahora, solo he encontrado formas de asignar roles mediante programación que necesitan el ID de rol.

Me pregunto si de alguna manera podría buscar los roles con su nombre (cadena), recuperar el ID del rol y luego asignar permiso. Simplemente no se siente bien.

vogelsang
fuente
La tabla de permisos usa el ID de rol, no el nombre del rol. Debe obtener la ID de rol y luego agregar el permiso con esa ID. La tabla de permisos necesita la cadena para el permiso y el nombre del módulo que lo implementa (al menos en Drupal 7); No estoy seguro de si el nombre del módulo se usa realmente de alguna manera.
kiamlaluno
¿Hay algo específico que no entiendas sobre el código que debes usar? ¿Qué código usaste? Mostrar su código sería útil; ayudaría a quién responda para sugerir lo que debe hacer (por ejemplo, informar qué está mal en su código).
kiamlaluno
Gracias por la respuesta. Creo que tengo que buscar los ID en la base de datos. No debería ser tan difícil.
vogelsang 01 de

Respuestas:

1

El módulo de características hace esto bastante bien, permitiéndole exportar roles y permisos (y muchas otras cosas) de una sola vez:

http://drupal.org/project/features

Pero si desea lanzar su propia API de permisos, consulte:

http://drupal.org/project/permissions_api

krlucas
fuente
2
El problema es que no conoce la identificación del rol cuando usa funciones porque se asignan cuando instala su función. Por lo tanto, debe encontrar los ID de alguna manera para asignar los permisos. Probablemente sea solo una búsqueda en la base de datos.
vogelsang 01 de
24

Las características son bastante útiles para cosas como esta. Sin embargo, si necesita crear roles y agregar permisos mediante programación, no tiene que buscar la base de datos por su cuenta.

Cuando crea un nuevo rol de usuario con user_role_save(), actualizará el objeto que pasó con el nuevo ID de rol de usuario que se asignó. Puede ver un ejemplo de esto en la standard_install()función en el perfil de instalación estándar.

$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')));

Este ejemplo muestra que puede crear una nueva función de usuario y luego acceder a su ridpropiedad, que fue completada por user_role_save(). También muestra cómo agregar permisos a ese rol con user_role_grant_permissions(). En este caso, está otorgando al rol de 'administrador' todos los permisos disponibles.

Si necesita obtener la identificación de un rol de usuario creado por otra persona, puede usarlo user_role_load_by_name()para obtener el objeto para ese rol de usuario. Entonces simplemente agarras la identificación con $role->rid.

Chaulky
fuente
2
Esto es bueno para otorgar / revocar múltiples permisos a la vez: api.drupal.org/api/drupal/modules%21user%21user.module/function/…
Brian Wood
20

Me gustaría agregar un ejemplo de código que esté más cerca de la pregunta original sobre cómo asignar permisos a roles existentes mediante programación.

Puede buscar los roles con su nombre, recuperar el ID del rol y luego asignar permisos de la siguiente manera (por ejemplo, en una implementación de 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
fuente