# Drupal

## Présentation

Drupal est un CMS écrit en PHP. Il peut utiliser des modules externes pour étendre ses fonctionnalités. L'un de ses modules peut être utilisé pour déléger l'authentification serveur au serveur web : Webserver Auth.

## Installation

Télécharger et installer le module Webserver Auth, en le décompressant dans le répertoire modules/.

## Configuration

### Activation du module Drupal

Aller dans l'interface administration et activer le module Webserver Auth.

### Hôte virtuel Drupal

Configurer l'hôte virtuel Drupal comme n'importe quel autre hôte virtuel protégé.

Si Drupal est protégé par un reverse-proxy LL::NG, convertir l'en-tête en variable d'environnement REMOTE_USER.

- Pour Apache:

    <VirtualHost *:80>
           ServerName drupal.example.com

           PerlHeaderParserHandler Lemonldap::NG::Handler

           ...

    </VirtualHost>

- Pour Nginx:

    server {
      listen 80;
      server_name drupal.example.com;
      root /path/to/application;
      # Requête interne d'authentification
      location = /lmauth {
        internal;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/llng-fastcgi-server/llng-fastcgi.sock;
        # Ignorer les données postées
        fastcgi_pass_request_body  off;
        fastcgi_param CONTENT_LENGTH "";
        # Conserver le nom d'hôte original
        fastcgi_param HOST $http_host;
        # Conserver la requête originale (le serveur LLNG va recevoir /llauth)
        fastcgi_param X_ORIGINAL_URI  $request_uri;
      }

      # Requêtes clients
      location / {
        auth_request /lmauth;
        auth_request_set $lmremote_user $upstream_http_lm_remote_user;
        auth_request_set $lmlocation $upstream_http_location;
        error_page 401 $lmlocation;
        try_files $uri $uri/ =404;

        ...

        include /etc/lemonldap-ng/nginx-lua-headers.conf;
      }
      location / {
        try_files $uri $uri/ =404;
      }
    }

### Hôte virtuel Drupal dans le manager

Aller dans le manager et créer un nouvel hôte virtuel pour Drupal.

Configurer simplement la règle d'accès.

Si LL::NG est utilisé par reverse-proxy, configurer l'en-tête `Auth-User`, aucun autre en-tête n'est utile.

### Protéger seulement la page d'administration

Avec la solution ci-dessus, tout le site Drupal sera protégé, ainsi aucun accès anonyme ne sera autorisé.

Vous ne pouvez pas utiliser la règle `unprotect` car la navigation Drupal est basée sur des requêtes basées sur des attributs (?q=admin, ?q=user, etc.), et la règle unprotect ne fonctionne que sur des correspondances d'URL.

Vous pouvez créer un hôte virtuel particulier et utiliser le module rewrite d'Apache pour choisir entre le site ouvert et le protégé :

    <VirtualHost *:80>
        ServerName drupal.example.com

        # DocumentRoot
        DocumentRoot /var/www/html/drupal/
        DirectoryIndex index.php

        # Redirect admin pages
        RewriteEngine On
        RewriteCond  %{QUERY_STRING} q=(admin|user)
        RewriteRule ^/(.*)$ http://admindrupal.example.com/$1 [R]

        LogLevel warn
        ErrorLog /var/log/httpd/drupal-error.log
        CustomLog /var/log/httpd/drupal-access.log combined
    </VirtualHost>
    <VirtualHost *:80>
        ServerName admindrupal.example.com

        # Protection SSO
        PerlHeaderParserHandler Lemonldap::NG::Handler

        # DocumentRoot
        DocumentRoot /var/www/html/drupal/
        DirectoryIndex index.php

        LogLevel warn
        ErrorLog /var/log/httpd/admindrupal-error.log
        CustomLog /var/log/httpd/admindrupal-access.log combined
    </VirtualHost>