Control de acceso a directorio externo desde Moodle

Este curso hemos usado la herramienta Forrest para generar los apuntes del título de experto en programación con tecnologías web. Forrest genera un sitio web que queríamos integrar de alguna manera en Moodle. No es tan sencillo como parece, puesto que debido al sistema de ficheros de Moodle, se puede enlazar una página html, pero cuando dentro de dicha página se encuentran enlaces relativos, el comportamiento no era el adecuado (en Moodle todo pasa por algún script PHP).

Entonces, lo que buscaba era alguna manera de hacer que un directorio de fuera de Moodle tuviera la autentificación que proporciona Moodle (esto sirve tanto para Forrest como para cualquier directorio que tengáis). La solución no es sencilla (para mí que no controlo mucho PHP ni Apache). Son varios pasos:

  • Imaginad que el directorio que se quiere proteger es /moodle/forrest (en el servidor puede que sea /var/www/html/moodle/forrest).
  • Hay que crear un fichero .htaccess en dicho directorio con el siguiente contenido:
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(.*)\.html$ index.php?file=$1\.html [L]
RewriteRule ^(.*)\.pdf$ index.php?file=$1\.pdf [L]
RewriteRule ^$ index.php?file=index.html [L]

Estas reglas lo que hacen es decirle a Apache que cuando llegue un fichero con extensión .html o .pdf se la pase al fichero index.php.

  • Hay que crear otro fichero index.php con el siguiente contenido:
<?php
require_once('../config.php'); // cargamos el fichero de configuración de Moodle
require_login(80); // esto llama a una función del API de Moodle que comprueba si se 
                   // está autentificado para el curso con id 80

$file=$_GET['file']; // recuperamos la variable file
if (strcmp("html",end(explode(".",$file)))==0) { // Se comprueba si termina en html
    $pagina=file_get_contents($file); // Si es así, se lee y se devuelve
    echo $pagina;
}
else {  // Si es otra (pdf) hacemos que devuelva el fichero y lo descargue.
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$file\"");
    $size=filesize($file);
    header("Content-Length: ".$size);
    header("Content-Transfer-Encoding: binary");
    readfile($file);
}
?>

Y ya está. Ahora, si intentamos entrar en ese directorio, nos pedirá la autentificación de Moodle (caso de no estar autentificado). OJO: se puede usar la función require_login() sin argumento, pero si permitimos acceso de invitados a nuestro Moodle, podrán entrar en los recursos de ese directorio.

Es posible que el código no sea óptimo y que se pueda hacer de otra manera, ya digo que no soy un especialista en estas lides, pero como dicen nuestros alumnos: funciona!! 🙂

Tags:

Reply

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *