Roles, permisos y Capacidades en Moodle: Una perspectiva tecnica

Published on
Tiempo de lectura: 5 min
––– visitas
thumbnail-image

La API de Acceso de Moodle es una herramienta poderosa para gestionar permisos de usuario, pero hay una gran cantidad de conocimientos prácticos que no se capturan en la documentación oficial (la cual DEBERÍAS leer). Este post tiene como objetivo llenar ese vacío, proporcionando a los desarrolladores y administradores de Moodle una comprensión técnica más profunda del sistema de capacidades y permisos de Moodle.

Entendiendo los Riesgos de las Capacidades

Las capacidades en Moodle están asociadas con riesgos que afectan la seguridad e integridad del sitio. Por ejemplo, una capacidad etiquetada con RISK_XSS implica que otorgar esta capacidad podría permitir a un usuario inyectar scripts potencialmente dañinos. Como desarrollador, es crucial entender estos riesgos para prevenir violaciones de seguridad. Al definir nuevas capacidades para tu plugin, siempre asigna el nivel de riesgo apropiado:

$capabilities = [
    'mod/myplugin:dosomething' => [
        'riskbitmask' => RISK_XSS | RISK_CONFIG,
        // ...
    ],
];

Cachéado de Capacidades y Rendimiento

Moodle almacena en caché las capacidades para optimizar el rendimiento. Sin embargo, los desarrolladores deben ser conscientes de las implicaciones. Cuando actualizas capacidades, debes limpiar la caché para aplicar los cambios. Esto se puede hacer a través de la interfaz de Moodle, programáticamente:

if ($capabilities_have_changed) {
    purge_all_caches();
}

o a través de la CLI:

/usr/bin/php /yourmoodleinstallation/admin/cli/purge_caches.php

Ajustes mas precisos sobrescribiendo Capacidades

Sobreescribir capacidades permite un control preciso de los permisos. Por ejemplo, un usuario podría tener la capacidad mod/forum:post a nivel de curso, pero podría ser sobrescrito a nivel del foro para restringir la publicación en un foro específico. Esto se hace ajustando los permisos en el contexto del foro específico:

$context = context_module::instance($forum->cmid);
assign_capability('mod/forum:post', CAP_PROHIBIT, $roleid, $context->id);

Bloqueo de Capacidades

El bloqueo de una capacidad es una medida de seguridad para prevenir su alteración en sub-contextos. Esto es particularmente importante para capacidades que podrían comprometer la integridad del sitio, como moodle/site:config.

Digamos que tienes una capacidad llamada moodle/site:config, que permite a los usuarios cambiar configuraciones a nivel del sitio. Esta es una capacidad poderosa que solo deberian tener los Administradores del Sitio. Para prevenir que esta capacidad sea otorgada accidentalmente en niveles inferiores de la jerarquía de contexto (como en un curso o módulo), puedes bloquear esta capacidad.

En términos prácticos, Moodle implementa esto a través del nivel de permiso CAP_PROHIBIT. Cuando estableces una capacidad a CAP_PROHIBIT en un nivel de contexto superior, no puede ser sobrescrita por ningún CAP_ALLOW en un nivel inferior.

Es importante notar que CAP_PROHIBIT es una configuración muy potente y debe usarse con moderación, ya que puede tener efectos de amplio alcance y puede ser difícil de sobrescribir si las circunstancias cambian. Es una herramienta para hacer cumplir políticas estrictas de permisos y asegurar que ciertas capacidades estén estrictamente controladas.

Mapeo de Arquetipos y Definiciones de Roles

Los arquetipos son plantillas para roles que proporcionan un punto de partida para las asignaciones de capacidades. Al crear un nuevo rol o capacidad, es importante mapearlo correctamente a un arquetipo:

$capabilities = [
    'mod/myplugin:view' => [
        'captype' => 'read',
        'contextlevel' => CONTEXT_MODULE,
        'archetypes' => [
            'student' => CAP_ALLOW,
            'teacher' => CAP_ALLOW,
            // ...
        ],
    ],
];

Contextos de Usuario y Permisos

Los contextos de usuario definen los límites de los permisos de un usuario. Por ejemplo, el contexto de usuario de un profesor puede permitirle editar cursos a los que está asignado pero no otros. Al desarrollar plugins, es importante verificar el contexto del usuario antes de permitir ciertas acciones:

$context = context_course::instance($courseid);
if (has_capability('moodle/course:edit', $context)) {
// El usuario puede editar este curso.
}

Auditorías Regulares de Capacidades

Realizar auditorías regulares de capacidades asegura que los permisos estén actualizados y sean seguros. Esto implica revisar las capacidades definidas en tu plugin y asegurar que sigan siendo necesarias y estén adecuadamente delimitadas. También es una buena práctica documentar cualquier cambio y sus implicaciones para los usuarios.

Consejos para Desarrolladores de Plugins

Al desarrollar un plugin de Moodle, define capacidades que sean consistentes con las convenciones de Moodle. Por ejemplo, si tu plugin es un nuevo módulo de actividad, podrías definir capacidades así:

$capabilities = [
  'mod/myactivity:view' => [
  // Definition
  ],
  'mod/myactivity:submit' => [
  // Definition
  ],
];

Recuerda incrementar el número de versión de tu plugin después de cambiar capacidades para que se apliquen estos cambios, esto se puede hacer a través de la interfaz de administración, o a través de la CLI:

/usr/bin/php /yourmoodleinstallation/admin/cli/upgrade.php

Al entender estos detalles técnicos e incorporarlos en tus prácticas de desarrollo, puedes aprovechar al máximo el sistema de capacidades de Moodle, creando plugins seguros y eficientes que mejoren la experiencia de Moodle.


Y esto es todo por hoy! Espero que hayas encontrado útil este post. Si tienes alguna pregunta, por favor contáctame en LinkedIn.

Happy coding!