Utilisation avec un système de SSO (par exemple LDAP)

Par défaut pour se connecter ce sont les comptes définis dans les fiches de membres qui sont utilisés, avec les mot de passe associés.

Cependant si Paheko est utilisé dans le contexte d'une installation utilisant d'autres outils, il peut être utile de mettre en commun l'authentification avec d'autres outils.

Une première manière de faire est d'utiliser Paheko comme source principale d'identification et authentification. Pour cela on peut utiliser ce serveur LDAP qui utilise la base de données de Paheko.

Une autre manière d'aborder la problématique est de considérer Paheko comme un simple gestionnaire de données, et ne pas utiliser le système d'authentification fourni, mais se reposer sur un SSO tiers, comme un serveur LDAP ou OpenID Connect externe par exemple.

C'est possible à partir de la version 1.3.

Pour cela il faut définir dans le fichier config.local.php la constante LOCAL_LOGIN sous forme de tableau (array) contenant les informations de l'utilisateur connecté, et les permissions.

Voici un exemple d'utilisateur connecté :

const LOCAL_LOGIN = [
	'user' => [
		'_name' => 'bohwaz',
	],
	'permissions' => [
		'users'      => 9,
		'accounting' => 9,
		'web'        => 9,
		'documents'  => 9,
		'config'     => 9,
	],
];

Le tableau user peut contenir n'importe quel champ de la fiche membre. La clé spéciale _name désigne le nom de l'utilisateur connecté, quel que soit le nom réel du champ "nom" de la fiche membre (les champs peuvent être renommés ou supprimés).

Pour les permissions, les valeurs acceptées sont :

0 Pas d'accès à cette partie, qui n'apparaîtra pas dans le menu
1 Accès en lecture
2 Accès en lecture et écriture
9 Accès administrateur

À noter que pour config, seules les valeurs 0 et 9 sont acceptées.

Limitations

Attention en activant ce mode, les fonctions de gestion de connexion et d'authentification sont désactivées :

  • l'utilisateur ne peut pas se déconnecter, c'est à vous de gérer la déconnexion d'une autre manière.
  • l'utilisateur ne pourra pas modifier ses informations personnelles, ni accéder à son historique d'activité.
  • l'utilisateur ne pourra pas configurer l'authentification à deux facteurs (2FA) ni le chiffrement des mails avec PGP.

Prendre en compte également que l'utilisateur connecté ne sera pas assimilé à un membre de l'association. Cela aura plusieurs impacts :

  • l'utilisateur ne pourra pas enregistrer de recherches enregistrées privées
  • les actions effectuées par ce membre seront enregistrées comme étant "anonymes" (par exemple il ne sera pas possible de savoir qui a créé une écriture)
  • l'utilisateur (s'il a la permission) pourra supprimer les administrateurs de l'association (ou les placer dans une catégorie qui les empêche de se connecter), empêchant quiconque de gérer l'association ensuite via la connexion classique de Paheko (par exemple si la base de données est exportée et importée sur une autre instance).

Exemple avec LDAP

Cet exemple utilise une page de connexion et vérifie les informations depuis un serveur LDAP.

const LDAP_HOST = 'localhost';
const LDAP_DN = 'cn=%s,ou=users,dc=yunohost,dc=org';

session_start();

if (empty($_SESSION['ldap_user']) && !empty($_POST['ldap_login']) && !empty($_POST['ldap_password'])) {
	$l = ldap_connect(LDAP_HOST) || die('Connexion impossible');
	ldap_set_option($l, LDAP_OPT_PROTOCOL_VERSION, 3);
	ldap_set_option($l, LDAP_OPT_REFERRALS, 0);
	ldap_set_option($l, LDAP_OPT_NETWORK_TIMEOUT, 10);

	$login = trim($_POST['ldap_login']);

	if (ldap_bind($l, sprintf(LDAP_DN, $login), $_POST['ldap_password'])) {
		$_SESSION['ldap_user'] = $login;
	}

	ldap_close($l);
}

if (empty($_SESSION['ldap_user'])) {
	echo '<!DOCTYPE html>
	<html>
	<body>
	<form method="post" action="">';

	if (!empty($_POST['ldap_login'])) {
		echo '<p style="color: red">Identifiants invalides</p>';
	}

	echo '
		<fieldset>
			<legend>Connexion</legend>
			<dl>
				<dt>Login</dt>
				<dd><input type="text" name="ldap_login" required /></dd>
				<dt>Mot de passe</dt>
				<dd><input type="password" name="ldap_password" required /></dd>
			</dl>
			<p><input type="submit" value="Connexion" /></p>
		</fieldset>
	</form>
	</body>
	</html>';
	exit;
}

define('Garradin\LOCAL_LOGIN', [
	'user' => [
		'_name' => $_SESSION['ldap_user'],
	],
	'permissions' => [
		'users'      => 9,
		'accounting' => 9,
		'web'        => 9,
		'documents'  => 9,
		'config'     => 9,
	],
]);