Lerm-IT

Blog traitant de technologies informatiques. Logiciel libre, AdminSys, DevOps et GNU/Linux !

14 Dec 2010

[symfony] Intégration LDAP dans sfDoctrineGuard

Vous l’aurez compris ces temps ci je fait du symfony ! Et aujourd’hui je vais tenter de présenter comment intégrer un annuaire LDAP au plugin sfDoctrineGuard.

Je passe sous silence l’installation qui est bien documenté dans la doc pour en venir directement au point manquant.

Vous trouverez la doc ici : http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin

La documentation propose d’utiliser une option dans notre fichier app.yml  : check_password_callable. Ceci est exacte (bien heureusement) mais incomplet.

En effet la validation d’un utilisateur par sfGuard se fait en plusieurs étapes et ce paramètre ne permet que de valider l’exactitude du mot de passe. Il faut donc que les utilisateurs soit présent dans la base de données de sfGuard. Ceci ne nous convenant pas nous allons contourner le problème.

Les options dans app.yml

En plus de l’option check_password_callable nous allons devoir utiliser l’option retrieve_by_username_callable. Cette dernière option va nous permettre de spécifier quelle fonction statique nous utiliserons pour récupérer l’objet représentant notre utilisateur. Ce  qui nous donne donc pour notre fichier app.yml :

app:

sf_guard_plugin:

check_password_callable: [UserMap, checkPassword]

retrieve_by_username_callable: [UserMap, getByUsername]

Ici nous spécifions donc que pour contrôler la validité du mot de passe nous utilisons UserMap::checkPassword($username,$password) et pour récupérer l’objet utilisateur UserMap::getByUsername($username).

Voyons comment construire ces classes

Notre objet UserMap

Notre objet UserMap doit posséder deux fonctions statiques que nous avons spécifié dans notre configuration :

  • public static function checkPassword($username, $passsword);
  • public static function getByUsername($username);

Ce qui nous donne une classe construite comme ceci (à adapter) :

class UserMap

{

public static function getByUsername($username)

{

$user = Ldap::getByUsername($username);

return $user;

return null;

}

public static function checkPassword($username, $password)

{

return $this->getByUsername($username)->checkPassword($password);

}

}

Ces fonctions agissent sur l’objet LdapUser que nous allons détailler.

Notre objet utilisateur

Pour pouvoir être utilisé par sfGuard notre objet LdapUser doit étendre la classe PluginsfGuardUser et redéfinir quelques fonctions :

  • checkPassword : que nous utilisont dans la classe UserMap pour vérifier le mot de passe d’un utilisateur
  • getIsActive : que sfGuard utilise pour vérifier que l’utilisateur est valide.

Ceci nous donne donc

class PockostUser extends PluginsfGuardUser

{

public function checkPassword($password)

{

if(… verifier le mot de passe …)

return true;

else

return false;

}

public function getIsActive()

{

return … validité de l’utilisateur …;

}

}

Vous pouvez maintenant utiliser votre authentification sans problème !

Conclusion

Même si documentation de sfDoctrineGuard n’est pas des plus importante en cherchant un peu dans le code on trouve beaucoup de fonctionnalités intéressantes comme celle présenté ici pour surcharger la fonction de récupération d’utilisateur.