ZendFramework et Auth
Bon je viens de découvrir comment tout ça ça marche, et je dois dire que je suis assez agréablement surpris !
Il est possible de développer des plugins aux controlleur ... (je vous laisse regarder la doc) du coup j'ai développer un formulaire que voici :
<?php $auth = Zend_Auth::getInstance(); ?> <div id="logbox"> <?php if ($auth->hasIdentity()) { Zend_Debug::dump($auth->getIdentity()); ?> <a href="?auth=logout">LogOut</a> <?php } else { ?> <form method="post" name="logbox"> <input type="hidden" name="formName" value="logbox" /> <input type="text" name="identity" /> <input type="password" name="credential" /> <input type="submit" value="<?= $this->i18n('Login') ?>" /> </form> <?php } ?> </div>
Vu la complexité du truc je mériterai bien une médaille ... Maintenant plutot que de checker tout ça comme un boucher nimporte ou ... place au plugin Auth :
class Plugin_Auth extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { $auth = Zend_Auth::getInstance(); if ($request->getParam('formName', null) == 'logbox') { $auth->clearIdentity(); $adapter = Zend_Registry::get('AuthAdapter'); $adapter->setIdentity($request->getParam('identity')); $adapter->setCredential($request->getParam('credential')); $result = $auth->authenticate($adapter); if (!$result->isValid()) { $request->setControllerName('Auth'); $request->setActionName('loginFailed'); $request->setParam('authResult', $result); } else { $this->getResponse()->setRedirect($request->getRequestUri()); } } if ($request->getParam('auth', null) == 'logout') { $auth->clearIdentity(); $this->getResponse()->setRedirect($request->getBaseUrl()); } } }
Ca check si oui ou non il y a les infos de login, ou de logout ! Si c'est pas valide on renvoie vers un autre controlleur, sinon on redirige pour vider le POST buffer ... dans le cas d'un logout, on renvoie vers la page d'accueil !
C'est propre et adapté a toutes situations ...
Dans le même gout, j'ai fait un plugin qui check les ACL pour chaque accès. Ce qui veut dire qu'au minimum vous devez avoir une architecture ou les ressources, c'est les controlleurs et les droits c'est les actions ... au minimum a veut dire qu'on peut étendre naturellement ...
C'est pas complet il manque la récupération du UserType dans la base, mais je ferai ça plus tard :
class Plugin_Acl extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { $auth = Zend_Auth::getInstance(); $userType = !$auth->hasIdentity() ? "User" : "AuthUser"; //TODO get the user type here $controller = ucwords($request->getControllerName()); $action = $request->getActionName(); $acl = Zend_Registry::get('ACL'); if (!$acl->isAllowed($userType, $controller, $action)) { $request->setControllerName('Auth'); $request->setActionName('unauthorized'); } } }
Bon naturellement pour utiliser tout ça il suffit de faire des registerPlugin juste avant le dispatch :
$controller->throwExceptions(true); $controller->registerPlugin(new Plugin_Auth()); $controller->registerPlugin(new Plugin_Acl()); $controller->dispatch();
Et voili ... tout est sécurisé et tout :)
