Ci dessous la liste des modifications à réaliser pour chaque application dont l'authentification devra être gérée par le SSO.
Gestionnaire
Il faut créer une classe fille de
sso\Handler que l'on mettra dans le dossier (ou un sous dossier) de
plugins du SSO
Si la classe s'appelle
App1Handler, le nom du fichier devra être
App1Handler.class.php.
Cette classe devra implémenter la méthode
public function init(AuthUser $user, SsoClient $sso); et simuler l'authentification.
Par exemple, si l'application vérifie la présence d'un cookie nommé
auth_app1 pour déterminer si l'utilisateur est connecté, on pourra utiliser l'implémentation suivante :
<?php
use sso\Handler;
use sso\AuthUser;
use sso\SsoClient;
class App1Handler extends Handler {
const COOKIE_NAME = 'auth_app1';
public function init(AuthUser $user, SsoClient $sso) {
$_COOKIE[self::COOKIE_NAME] = 1; // for first call
setcookie(self::COOKIE_NAME, 1, 0, $this->path); // for other calls
}
}
La méthode
init() sera appelée à chaque page de l'application.
Il est également possible d'enregistrer des variables dans le SSO avec la méthode
registerGlobals. Ces variables seront enregistrées en session et restaurées
sur chaque page automatiquement dans des variables globales.
Cela peut être utilisé pour sauvegarder les traitements nécessaires à l'authentification.
Par exemple :
<?php
class ... extends Handler {
public function init(AuthUser $user, SsoClient $sso) {
global $var1;
if (!isset($var1)) {
// connexion à la base de données de l'application
// récupération du token de connexion de l'utilisateur depuis la base de données dans $var1, en utilisant $user->id
// enregistrement de la variable dans la session
$sso->registerGlobals(array(
'var1' => $var1,
));
}
$_COOKIE[self::COOKIE_NAME] = $var1;
setcookie(self::COOKIE_NAME, $var1, 0, $this->path);
}
}
Avec ce code :
- Lors du 1er appel, c'est à dire juste après un login réussi sur le SSO, on enregistrera une valeur (le token de connexion récupéré depuis la base)
dans la session ET dans une variable globale
$var1
- Pour chaque page, on va récupérer cette valeur et l'utiliser pour définir le cookie permettant de dire à l'application que l'utilisateur est authentifié.
Login avec SSO
Il faudra également modifier chaque page accessible pour appeler le SSO.
Si l'application inclus un fichier PHP sur chaque page, l'appel peut se faire dans ce fichier, sinon il faudra modifier réellement chaque page de l'application (qui est alors en général mal conçue)
Le code à ajouter est le suivant :
<?php
require_once(implode(DIRECTORY_SEPARATOR, array(__DIR__, '..', 'sso', 'lib', 'SsoClient.class.php'))); // charge la classe principale du SSO
$sso = sso\SsoClient::getInstance('../sso'); // Initialise le SSO, le paramètre est le chemin web relatif jusqu'au SSO
$currentUser = $sso->auth(); // Authentifie l'utilisateur
Si l'utilisateur n'est pas authentifié, la méthode
auth() redirigera l'utilisateur vers la page de login du SSO.
Pour cela, ce code doit se trouver
avant tout affichage sur chaque page.
Si l'utilisateur est authentifié, l'exécution continue et
$currentUser peut être récupéré si besoin
Si l'on souhaite afficher le menu du SSO dans l'application cliente, il faut modifier le code de chaque page à 2 endroits :
- Dans la balise <head> :
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
...
<?php $sso->displayMenuCssHeader(); // affiche la balise <link> avec le CSS du menu ?>
<title>...</title>
</head>
- Juste après l'ouverture de la balise <body> :
<body>
<?php $sso->displayMenu(); // affiche le menu ?>
...
Si on ne peux pas modifier le contenu de la balise <head>, il est possible d'appeler la méthode suivante, n'importe où sur la page, dans la balise body (même juste avant sa fermeture) :
...
<?php $sso->displayFullMenuAfterBody(); ?>
</body>
Le style du menu sera alors ajouté à postériori, en javascript.
Déconnexion
Si l'application possède un lien
Déconnexion, il faut le modifier et rediriger vers n'importe quelle page avec le paramètre
sso_logout
Par exemple :
<a href="?sso_logout">Se déconnecter</a>
Utilisateur connecté
Dans l'application cliente il est possible de récupérer l'utilisateur connecté sur le SSO avec :
<?php
$sso = \sso\SsoClient->getInstance(); // récupère l'instance actuelle du SSO
$user = $sso->getUser(); // récupére l'utilisateur sous forme d'un objet AuthUser
?>
Lorsque l'utilisateur a été récupéré depuis une méthode d'authentification comme un LDAP ou une base de données, il est possible que certains champs soient également accessibles sur l'objet
$user.
Par exemple, si l'utilisateur vient d'un LDAP, on pourra en général écrire :
<?php
// dn est une propriété dynamique rajoutée sur l'objet AuthUser a partir des champs du LDAP
echo "Le chemin complet de l'utilisateur dans le LDAP est : ".$user->dn;
echo '<pre>';
print_r(get_object_vars($user)); // affiche l'ensemble des propriétés de l'utilisateur définies dans le LDAP
echo '</pre>';
?>