Ein eigener Zend_Auth_Adapter gegen einen IMAP Server
Mit Hilfe von Zend_Auth kann man wunderbar Authentifizierungen durchführen, und dem Zend Framework liegen auch bereits einige Adapter bei, wie zum Beispiel DbTable, Digest, Http, InfoCard, Ldap und OpenId. In einem meiner Projekte wollte ich gegen einen IMAP-Server authentifizieren, jeder der einen IMAP-Account hat soll sich auf der Webseite einloggen können. Dazu habe ich einen kleinen Auth-Adapter geschrieben, den man so benutzt:
// authenticate against imap $imapAdapter = new App_Auth_Adapter_Imap($this->_applicationIni->imap->host); $imapAdapter->setIdentity($formData['LoginName']) ->setCredential($formData['LoginPassword']); $result = $imapAdapter->authenticate(); if (!$result->isValid()) { // Authentication failed } else { // Authentication successful }
Der genutzte Adapter sieht so aus:
<?php class App_Auth_Adapter_Imap implements Zend_Auth_Adapter_Interface { private $_imapHost; private $_identity; private $_credential; /** * Constructor to set IMAP host * * @return void */ public function __construct($imapHost) { $this->_imapHost = $imapHost; } /** * Authenticate against IMAP host with identity and credential * * @throws Zend_Auth_Adapter_Exception If authentication is not successful * @return Zend_Auth_Result */ public function authenticate() { // check _identity and _credential against imapHost try { new Zend_Mail_Storage_Imap(array( 'host' => $this->_imapHost, 'user' => $this->_identity, 'password' => $this->_credential)); } catch (Zend_Mail_Protocol_Exception $e) { // connect failed! return new Zend_Auth_Result( Zend_Auth_Result::FAILURE, null, array( 'Connect to IMAP server failed!') ); } catch (Zend_Mail_Storage_Exception $e) { // login was not successful return new Zend_Auth_Result( Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, null, array( 'Login failed.', $e->getMessage()) ); } return new Zend_Auth_Result( Zend_Auth_Result::SUCCESS, $this->_identity, array('Authentication successful.') ); } /** * setIdentity() - set the value to be used as the identity * * @param string $value * @return App_Auth_Adapter_Imap Provides a fluent interface */ public function setIdentity($value) { $this->_identity = $value; return $this; } /** * setCredential() - set the credential value to be used, optionally can specify a treatment * to be used, should be supplied in parameterized form, such as 'MD5(?)' or 'PASSWORD(?)' * * @param string $credential * @return App_Auth_Adapter_Imap Provides a fluent interface */ public function setCredential($credential) { $this->_credential = $credential; return $this; } }
Wie man sieht ist die wichtigste Methode die authenticate()-Methode. Wenn ihr also selbst einen anderen Auth-Adapter basteln wollt, müßt ihr die einfach nur ersetzen und die entsprechenden Zend_Auth_Result Objekte zurückliefern. So einfach ist das.
Hier nicht wirklich passend, aber:
dein Link für den ZCE geht nicht mehr, da kommt ne weiße Seite!
Sascha
19 Apr 11 at 13:39
Bei mir funktioniert sie, kannst du sie bitte nochmal prüfen?
Michael Kliewe
19 Apr 11 at 14:30
Coole sache. Ich nehme mal an die Rückgabe des AuthResults ist schlicht und einfach die Vorgaben des Zend_Auth_Adapter_Interfaces… frage mich nur wieso nicht einfach die Exceptions geworfen werden.
Michael Rüfenacht
23 Apr 11 at 10:24