Permisos de usuario en base al valor de un campo en Drupal 7

En un proyecto Drupal es muy normal tener varios tipos de contenidos con diferentes permisos para los diferentes roles del sistema. Drupal está muy preparado para esto y existen infinidad de módulos que nos permiten ampliar estas funcionalidades.

Sin embargo, si cada vez que debemos añadir un rol que tenga permiso sobre sólo un tipo de contenido, podemos acabar con decenas de tipos de contenidos que son idénticos. Esto convierte a nuestro Drupal en un sistema de gestión algo engorroso, porque además para cambiar un contenido de propietario debemos convertirlo en otro tipo de contenido mediante algún otro módulo.

Mi solución

La solución que propongo es crear un campo en un único tipo de contenido en el que aparezcan los distintos roles del sistema, y que sólo los usuarios que pertenezcan a dicho rol puedan realizar cambios sobre él. Las ventajas son varias. Para empezar no tendremos muchos tipos de contenidos idénticos (uno por cada rol), si no que tendremos solo uno. Además cambiar un permiso será tan fácil como entrar en el contenido y cambiar el rol al que pertenece.

¿Cómo lo hacemos?

En primer lugar debemos crear en nuestro tipo de contenido (por ejemplo, Página) un campo en el que aparezcan los roles del sistema. Para ello instalaremos el módulo Role Reference y después crearemos el campo. Mientras lo creamos podemos definir qué roles van a ser seleccionables y cuáles no, lo que nos permitirá excluir roles genéricos como el anónimo o el autenticado. Pongamos que el nombre del campo es field_page_rol.

Ahora tenemos que crear nuestro módulo custom aprovechando las bondades de hook_node_access:

Este hook se ejecuta para comprobar si el usuario actual tiene acceso o no al contenido. Vamos a ir viendo el código poco a poco. En ocasiones el parámetro $node que recibe este hook es el tipo de contenido, pero otras veces recibe el objeto nodo. Por eso lo comprobamos y obtenemos el valor del tipo de contenido metiéndolo en una variable:

Ahora vamos a comprobar si el tipo de contenido es página, porque solo en este caso queremos que se ejecute esta comprobación. Además el usuario debe estar autenticado en el sistema, y el parámetro $node debe ser un objeto, ya que si no lo es no procede denegar permisos. Si no se cumple ninguna de estas condiciones, le diremos a Drupal que haga el resto de comprobaciones de acceso que otros módulos pueden implementar, ya que no queremos interferir en el proceso:

Ahora vamos a comprobar si el valor del campo rol que tiene el nodo definido está entre los roles que tiene el usuario actual. Si no lo está, vamos a denegarle cualquier operación que no sea ver el contenido, es decir que no vamos a permitir ni editarlo ni borrarlo:

Aquí debería simplemente permitir el acceso sea cual sea la operación, pero vamos a rizar el rizo una vez más. Supongamos que tenemos un rol que es gestor que queremos que pueda realizar todas las operaciones, pero si el usuario no es gestor solo podrá editar. Así que miramos si la operación es editar, y si es así autorizamos el acceso:

Ahora vamos a obtener el identificador del rol gestor, y si el usuario actual tiene ese rol asignado, le vamos a autorizar a crear y borrar contenido. Si no lo tiene, Drupal es restrictivo por naturaleza y no le va a permitir ejecutar esas acciones:

Y ya está, con un simple módulo contribuido y otro personalizado con una sola función, ya tenemos nuestra funcionalidad implementada.

Experto en la Gestión de Proyectos Web basados en Drupal con más de 8 años de experiencia. Desarrollo Full Stack (Front-end, Back-end, Site-Builder).

No Replies to "Permisos de usuario en base al valor de un campo en Drupal 7"