En Drupal un administrador de usuarios es superpoderoso

Escrito por Roberto M. Oliva el Octubre 23rd, 2009

En Drupal, inicialmente, hay tres tipos de usuarios: Anónimos, autenticados y el usuario con ID 1. A este usario 1 yo le denomino usuario root por su analogía con el mundo Linux. El usuario con ID 1 tiene, por defecto, permiso para todo. Drupal, cuando comprueba que el ID del usuario es 1, ya no comprueba nada más le concede permiso directamente.

Nosotros montamos una versión personalizada de Drupal. Lo cual, siguiendo con la analogía Linux, lo podríamos considerar como una distribución propia de Drupal. En pocos minutos tenemos una web totalmente configurada y preparada con la funcionalidad establecida para que nuestro cliente se ponga manos a la obra, para él creamos un rol denominado administrador, de tal manera que introducimos un nuevo tipo de usuario entre medias. Él no accede a Drupal, accede directamente a un gestor de contenidos donde mantener y categorizar noticias, enlaces imágenes, etc… y usuarios! y aquí es donde aparece la discordia.

Un administrador de una de estas webs tiene que poder administrar usuarios y al administrar usuarios lo hace también del usuario root 8/. Por lo que puede, perfectamente, cambiarle la contraseña y acceder como él. Existen muchos comentarios sobre este asunto (Security: The “administer users” permission exposes user/1), pero para mí claramente es una brecha de seguridad. El usuario root debería de estar por encima de cualquier administrador y nadie (y menos un “simple” administrador de usuarios) debería de poder modificar sus datos.

Por otro lado, evidentemente, esto es software libre (nunca daremos suficientes gracias a la comunidad que hay detrás) y podemos modificarlo a nuestro gusto. No es que me guste modificar el core de Drupal, de hecho es una de las mejores características de Drupal: no es necesario tocar el núcleo para conseguir la funcionalidad buscada, basta con añadir los módulos necesarios. Pero en este caso no hay más remedio y, teniendo en cuenta que mi prioridad es modificar lo menos posible, implementé la siguiente modificación (modules/user/user.module):

< ?php
function user_save($account, $array = array(), $category = 'account') {
  global $user;
  if($account->uid==1 && $user->uid != 1) {
     drupal_set_message(t("Only root user can change its user information"), "error");
     return user_load($account->uid);
  }

  // Dynamically compose a SQL query:
  $user_fields = user_fields();
   ...
}

Reconozco que no es muy elegante, pero cumple su función: Por mucho que asigne administración de usuarios a cualquier usuario ninguno podrá acceder como root al sitio y, además modifico mínimamente el core de Drupal.

Escritos anteriores

Un WTF para variar

Escrito por Roberto M. Oliva el Agosto 24th, 2009

Testeo paranóico de JSON con Cucumber

Escrito por Roberto M. Oliva el Julio 30th, 2009

Document-oriented Databases

Escrito por Roberto M. Oliva el Julio 9th, 2009

Sobreescribir menu links del core de Drupal 6

Escrito por Roberto M. Oliva el Febrero 26th, 2009

Otra manera de calcular la media ponderada en Ruby

Escrito por Roberto M. Oliva el Febrero 16th, 2009

Hook_theme en Drupal 6

Escrito por Roberto M. Oliva el Octubre 10th, 2008

Flex: Atendiendo a la finalizacion de comandos

Escrito por Roberto M. Oliva el Julio 22nd, 2008

Desplegando Rails

Escrito por Roberto M. Oliva el Abril 16th, 2008

Retomando…

Escrito por Roberto M. Oliva el Abril 1st, 2008

Bienvenido a mi blog.

Gracias por visitarla. Date una vuelta y mira a ver si te interesa lo que escribo. Por supuesto que me gustaría conocer tu opinión, así que siéntete libre de poner tus comentarios. Espero que te guste!