Pimcore – Créer une authentification sur le front
Pimcore a un système d’authentification pour son backoffice, mais on peut avoir besoin d’avoir une authentification sur le front.
C’est ce que nous allons voir dans ce tutorial.
Quand l’utilisateur se connectera sur le front, l’authentification sur le backoffice sera aussi faite et inversement.
Quand l’utilisateur se déconnectera sur le front, la déconnexion sera aussi effective sur le backoffice et inversement.
1/ Vue
Dans /website/views/scripts/default, on créé une vue « login.php » qui contient le code html pour se connecter :
<html> <head> <title>Authentification</title> </head> <body> <form method="POST" action="login"> <p>login <input type="text" name="username" value="" /></p> <p>password <input type="password" name="password" value="" /></p> <p><input type="submit" name="submit" value="Se connecter" /></p> </form> <br /> <?php echo $this->message; ?> </body> </html>
2/ Controlleur
Nous allons maintenant créer le contrôleur « DefaultController.php » avec le code suivant :
<?php class DefaultController extends Website_Controller_Action { public function defaultAction () { } public function loginAction (){ $this->view->message = ''; if (( isset($_REQUEST['username'])) && ( isset($_REQUEST['password']) )){ $oAuth = new Website_Cultivonsleweb_Security_Authentification (); if ( $oAuth->login () ){ $this->_redirect ('/accueil'); } else { $this->view->message = 'identifiant et/ou mot de passe incorrect !'; } } $this->render ('login'); } public function logoutAction (){ $oAuth = new Website_Cultivonsleweb_Security_Authentification (); if ( $oAuth->logout () ){ $this->_redirect ('/login'); } } }
Il faut bien sûr adapter les chemins de redirection à son environnement particulièrement la page « accueil ».
3/ Librairie
Dans le contrôlleur, on fait appel à une classe qui se nomme « Website_Cultivonsleweb_Security_Authentification ».
C’est le coeur de l’authentification. Elle étend la classe « Pimcore_Tool_Authentication » et adapte du code des classes « Admin_LoginController » (dans /pimcore/modules/admin/controllers) et « User » (dans pimcore/models).
Voici le contenu de cette classe :
<?php /** * Couche d'authentification à Pimcore * * @category Website * @package Cultivonsleweb * @subpackage Security * @author Arnaud Méhat pour Cultivons le web <contact at cultivonsleweb.com> * @see Admin_LoginController in pimcore/modules/admin/controllers * @see User in pimcore/models */ class Website_Cultivonsleweb_Security_Authentification extends Pimcore_Tool_Authentication { /** * contains the session namespace object * @var Zend_Session_Namespace */ private static $session; public function login (){ if (null == $this->_getParam("username")){ return false; } if (null == $this->_getParam("password")){ return false; } $userInactive = false; $token = self::getToken ($this->_getParam("username"), $this->_getParam("password")); try { $user = User::getByName($this->_getParam("username")); if ($user instanceof User) { if ($user->isActive()) { $authenticated = false; if ($user->getPassword() == Pimcore_Tool_Authentication::getPasswordHash($this->_getParam("username"), $this->_getParam("password"))) { $authenticated = true; } else if ($token/*$this->_getParam("token")*/ and Pimcore_Tool_Authentication::tokenAuthentication($this->_getParam("username"), $token/*$this->_getParam("token")*/, MCRYPT_TRIPLEDES, MCRYPT_MODE_ECB, false)) { $authenticated = true; // save the information to session when the user want's to reset the password // this is because otherwise the old password is required => see also PIMCORE-1468 if($this->_getParam("reset")) { $adminSession = Pimcore_Tool_Authentication::getSession(); $adminSession->password_reset = true; } } else { throw new Exception("User and Password doesn't match"); } if ($authenticated) { $adminSession = Pimcore_Tool_Authentication::getSession(); $adminSession->user = $user; Zend_Session::regenerateId(); } } else { $userInactive = true; throw new Exception("User is inactive"); return false; } } else { throw new Exception("User doesn't exist"); return false; } } catch (Exception $e) { //see if module or plugin authenticates user $user = Pimcore_API_Plugin_Broker::getInstance()->authenticateUser($this->_getParam("username"),$this->_getParam("password")); if($user instanceof User){ $adminSession = Pimcore_Tool_Authentication::getSession(); $adminSession->user = $user; //$this->_redirect("/admin/?_dc=" . time()); return true; } else { $this->writeLogFile($this->_getParam("username"), $e->getMessage()); Logger::info("Login Exception" . $e); //$this->_redirect("/admin/login/?auth_failed=true&inactive=" . $userInactive); return false; exit; } } //$this->_redirect("/admin/?_dc=" . time()); return true; } /** * Déconnexion * * @param string $path default /admin/login/" * @access public */ public function logout() { $adminSession = Pimcore_Tool_Authentication::getSession(); if ($adminSession->user instanceof User) { Pimcore_API_Plugin_Broker::getInstance()->preLogoutUser($adminSession->user); $adminSession->user = null; } Zend_Session::destroy(); setcookie("pimcore_opentabs", false, 315554400, "/"); return true; } public static function getToken ($username, $plainTextPassword){ $passwordHash = Pimcore_Tool_Authentication::getPasswordHash($username, $plainTextPassword); return Pimcore_Tool_Authentication::generateToken($username, $passwordHash, $algorithm = MCRYPT_TRIPLEDES, $mode = MCRYPT_MODE_ECB); } /** * Retourne la valeur envoyé en http * * @param string $key * @return string $value * @access protected */ protected function _getParam($key){ $frontController = Zend_Controller_Front::getInstance(); $request = $frontController->getRequest(); return $request->getParam ($key); } }
4/ Admin
Enfin pour que tout fonctionne, on se connecte au back-office.
On créé dans l’arborescence une page « login », dans la partie configuration de cette page, on lui associe le controlleur « default » et l’action « login ».
On créé aussi une page « logout », dans la partie configuration de cette page, on lui associe le controlleur « default » et l’action « logout ».
Et maintenant, la page « accueil » qui sera la page à laquelle on pourra se connecter si on est authentifié.
Et voilà une authentification complète.