Como evitar problemas de node access durante el proceso de cron

Hace unos días en Ymbra tuvimos un desafio sobre entidades en Drupal 7 que consistía en que no se cargaban durante una ejecución de cron. El principal problema era que cron no se ejecutaba con las credenciales suficientes y necesitábamos más permisos pare ejecutar ciertas tareas.

Estas entidades tenían restricciones de acceso que habíamos definido y en el momento que se ejecutaba cron como usuario anónimo (aunque se lanzara como el usuario con id=1) estas restricciones se respetaban y no podíamos cargar nuestra entidad para mandar su contenido en un correo electrónico.

Entonces ¿Qué podemos hacer para lanzar cron como administrador?

En hook_cron() podemos hacer:

/**
 * Implements hook_cron().
 */
function mymodule_cron() { 
  global $user;
  $user = user_load(1);
}

Y también hay que asegurarse que este hook se ejecuta antes que el hook (en este caso otro hook_cron) que necesita permisos elevados modificando el campo weight de mymodule en la tabla system.

Es importante comentar que se ejecuta el cron de Drupal en el navegador (lo que antes se conocía como poorman's cron) no es una buena práctica y podría causar problemas con esta solución. Por tanto recomendamos ejecutar cron con Drush en un cron de sistema de vuestro servidor.

Como medida adicional podéis devolver la variable global $user a su estado anónimo una vez que hayáis terminado el código que necesitaba los privilegios para minimizar el impacto.

Podéis leer más sobre este tema en este hilo relacionado.