Exemple d’implémentation pour trustExternal()

Voici les détails dont vous avez besoin de savoir pour éclaircir la documentation :

  1. La fonction trustExternal() sera appelée à chaque chargement de page. Cependant, les paramètres $user et $pass ne sont non vide (ou non null?) que lorsque l'utilisateur se connecte pour la première fois. Sur tous les chargements de page suivants, ils seront vides (ou null?).
  2. Vous devez remplir le tableau $USERINFO (name, mail et grps) pour chaque chargement de page.

Donc, une solution est de vérifier d'abord la variable $_SESSION de la connexion précédente. Si elle est trouvé, remplir le tableau $USERINFO et retourner true. Sinon, utiliser la base de données pour trouver l'identifiant.

Voici une solution complète. Cet exemple vérifie une base de données mongodb, mais il est possible de changer facilement ceci pour utiliser n'importe quel autre type de base.

auth_mongodb.class.php
class auth_mongodb extends auth_basic {
 
	var $connection = null;
 
	function __construct() {
		global $config_cascade;
		global $connection;
 
		$this->cando['external'] = true;
		$this->cando['logout'] = true;
 
		$connection = new Mongo("server_ip");
	}
 
	function trustExternal($user, $pass, $sticky = false) {
 
		global $USERINFO;
		global $conf;
		global $connection;
 
		$sticky ? $sticky = true : $sticky = false; //sanity check
 
		if (!empty($_SESSION[DOKU_COOKIE]['auth']['info'])) {
			$USERINFO['name'] = $_SESSION[DOKU_COOKIE]['auth']['info']['user'];
			$USERINFO['mail'] = $_SESSION[DOKU_COOKIE]['auth']['info']['mail'];
			$USERINFO['grps'] = $_SESSION[DOKU_COOKIE]['auth']['info']['grps'];
			$_SERVER['REMOTE_USER'] = $_SESSION[DOKU_COOKIE]['auth']['user'];
			return true;
		}
 
		if (!empty($user)) {
			// vérification en base
			$collection = $connection->DatabaseName->admins;
			$login = $collection->findOne(array('name' => $user));
			if ($login == null) return false;
 
			if ($login['password'] != sha1($login['_id'] . $pass)) {
				msg('Incorrect username or password.');
				return false;
			}
 
			// definir les varaible global
			$USERINFO['name'] = $login['name'];
			$USERINFO['mail'] = $login['email'];
			$USERINFO['grps'] = $login['name'] == 'Admin' ? array('admin','user'): array( 'user');
			$_SERVER['REMOTE_USER'] = $login['name'];
			$_SESSION[DOKU_COOKIE]['auth']['user'] = $login['name'];
			$_SESSION[DOKU_COOKIE]['auth']['mail'] = $login['email'];
			$_SESSION[DOKU_COOKIE]['auth']['pass'] = $pass;
			$_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO;
			return true;
		} else {
			return false;
		}
 
	}
}