tuto:webapps:llng:dokuwiki

Ceci est une ancienne révision du document !


Authentification de dokuwiki sur LemonLDAP::NG

Dokuwiki dispose d'un système de plugin permettant de facilement intégrer d'autres techniques d'authentification. Cette page vous permettra de connecter votre dokuwiki sur une instance de LemonLDAP::NG

La première étape est de déclarer un virtualhost pour votre wiki, par exemple wiki.domain.tld

Au niveau des règles, tout dépends des ACL que vous désirez. Si vous voulez un wiki entièrement privé, alors, on peut créer une simple règle n'autorisant l'accès au vhost qu'aux utilisateurs authentifiés:

  • Expression: default
  • Règle: accept

Si par contre, vous voulez avoir une partie publique, et une privée, il faut deux règles distinctes:

  • Commentaire: 01data
  • Expression: ^/data
  • Règle: deny
  • Commentaire: 02login
  • Expression: ^/(?i)doku.php(/start)?\?(.*)do=login
  • Règle: $groups =~ /\bwiki\b/
  • Commentaire: 03logout
  • Expression: ^/(?i)doku.php(/start)?\?(.*)do=logout
  • Règle: logout_app
  • Expression: default
  • Règle: unprotect

La première règle permet de protéger l'accès au répertoire data, la seconde redirige les utilisateurs vers le portail d'authentification lorsqu'ils cliquent sur le bouton “Connexion”, et n'autorise que les membres du groupe “wiki”. La troisième règle intercepte le clieque sur le bouton “Déconnexion” et redirige l'utilisateur sur le portail, enfin, la quatrième règle indique à LemonLDAP de ne pas contrôler l'accès au wiki (ce sont les ACL de dokuwiki qui gèreront ça)

Il faut maintenant configurer les entêtes HTTP. Les entêtes sont utilisées pour transmettre des informations sur l'utilisateur vers l'application. Ainsi, dokuwiki pourra récupérer le login, le nom complet, l'adresse mail et les groupes des utilisateurs authentifiés. Par défaut, une seule entête est configurée:

  • Auth-User ⇒ $uid

Il faut en créer 3 autres:

  • User-Groups ⇒ $groups
  • User-Mail ⇒ $mail
  • User-Name ⇒ $cn

(bien sûre, ces variables dépendent de ce que vous exporter au niveau de LemonLDAP, mais avec une configuration par défaut, toutes ces variables sont pré-configurées)

Comme pour n'importe quelle application, il faut configurer apache pour que LemonLDAP intercepte toutes les requêtes vers l'application en question, en ajoutant simplement:

PerlHeaderParserHandler My::Package

dans le virtualhost apache, ou dans une section <Directory> (là où dokuwiki est accessible). Si l'installation est sur une iPasserelle, les commandes suivantes se chargeront de configurer apache comme il se doit:

db domains setprop wiki.domain.tld DocumentRoot /opt/dokuwiki TemplatePath WebAppVirtualHost LemonLDAP enabled PHPBaseDir /tmp:/opt/dokuwiki
signal-event domain-modify wiki.domain.tld

Il suffit de copier/coller le code suivant dans le fichier inc/auth/lemonldapng.class.php

<?php
/**
 * auth/lemonldap-ng.class.php
 *
 * Authenticate and retrieve user informations from a LemonLDAP::NG instance
 *
 * @author    Daniel Berteaud <dani@firewall-services.com>
 */
 
class auth_lemonldapng extends auth_basic {
 
  var $success = true;
 
 
  /**
   * Posible things an auth backend module may be able to
   * do. The things a backend can do need to be set to true
   * in the constructor.
   */
  var $cando = array (
    'addUser'     => false, // can Users be created?
    'delUser'     => false, // can Users be deleted?
    'modLogin'    => false, // can login names be changed?
    'modPass'     => false, // can passwords be changed?
    'modName'     => false, // can real names be changed?
    'modMail'     => false, // can emails be changed?
    'modGroups'   => false, // can groups be changed?
    'getUsers'    => false, // can a (filtered) list of users be retrieved?
    'getUserCount'=> false, // can the number of users be retrieved?
    'getGroups'   => false, // can a list of available groups be retrieved?
    'external'    => true, // does the module do external auth checking?
    'logout'      => true,  // can the user logout again? (eg. not possible with HTTP auth)
  );
 
  function auth_lemonldapng() {
    global $conf;
    $this->cnf = $conf['auth']['lemonldapng'];
 
    // Set default headers name
    if(empty($this->cnf['header_login'])) $this->cnf['header_login'] = 'HTTP_AUTH_USER';
    if(empty($this->cnf['header_name'])) $this->cnf['header_name']  = 'HTTP_USER_NAME';
    if(empty($this->cnf['header_mail'])) $this->cnf['header_mail'] = 'HTTP_USER_MAIL';
    if(empty($this->cnf['header_groups'])) $this->cnf['header_groups'] = 'HTTP_USER_GROUPS';
  }
 
  function logOff(){
    setcookie(DokuWiki, 'FALSE', time() - 600000, '/');
    // Head the Lemon Logout page
    $location = array();
    if ( preg_match("#https?://[^/]*#", $_SERVER["HTTP_REFERER"], $location)) {
    	header('Location: '.$location[0].'/logout');        
    } else {
        nice_die("Disconnection failed");
    }
  }
 
  function trustExternal($user,$pass,$sticky=false){
    global $USERINFO;
 
    $username = $_SERVER{$this->cnf['header_login']};
    $USERINFO['name'] = $_SERVER{$this->cnf['header_name']};
    $USERINFO['mail'] = $_SERVER{$this->cnf['header_mail']};
    $USERINFO['grps'] = preg_split("/; /", $_SERVER{$this->cnf['header_groups']});
 
    // print info if debug is enabled
    if ($this->cnf['debug']){
      msg('LemonLDAP::NG Login Name: '.htmlspecialchars($username),0,__LINE__,__FILE__);
      msg('LemonLDAP::NG Full Name: '.htmlspecialchars($USERINFO['name']),0,__LINE__,__FILE__);
      msg('LemonLDAP::NG User Email Address: '.htmlspecialchars($USERINFO['mail']),0,__LINE__,__FILE__);
      if (is_array($USERINFO['grps'])) foreach ($USERINFO['grps'] as $group){
        msg('LemonLDAP::NG User Groups: '.htmlspecialchars($group),0,__LINE__,__FILE__);
      }
    }
    $success = $USERINFO !== false;
    if ($success) {
      $_SERVER['REMOTE_USER'] = $username;
      $_SESSION[DOKU_COOKIE]['auth']['user'] = $username;
      $_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO;
    }
    return $success;
  }
}

Il ne reste plus qu'à modifier la configuration de dokuwiki pour qu'il utilise ce nouveau plugin pour l'authentification, pour cela, il suffit de modifier le fichier conf/local.php, et de configurer:

$conf['authtype'] = 'lemonldapng';

Le plugin ne nécessite pas réellement de configuration, mais vous pouvez toutefois changer le nom des entêtes HTTP, et activer le debug, par exemple:

$conf['auth']['lemonldapng']['debug'] = 1;
$conf['auth']['lemonldapng']['header_login'] = 'HTTP_AUTH_USER';
$conf['auth']['lemonldapng']['header_name'] = 'HTTP_USER_NAME';
$conf['auth']['lemonldapng']['header_mail'] = 'HTTP_USER_MAIL';
$conf['auth']['lemonldapng']['header_groups'] = 'HTTP_USER_GROUPS';

Enjoy ;-)

  • tuto/webapps/llng/dokuwiki.1294386502.txt.gz
  • Dernière modification: 07/01/2011 08:48
  • de dani