PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Ein eigener Zend_Auth_Adapter gegen einen IMAP Server

with 3 comments

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.

Written by Michael Kliewe

April 19th, 2011 at 10:26 am

Posted in PHP

Tagged with , , ,

3 Responses to 'Ein eigener Zend_Auth_Adapter gegen einen IMAP Server'

Subscribe to comments with RSS or TrackBack to 'Ein eigener Zend_Auth_Adapter gegen einen IMAP Server'.

  1. 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

  2. Bei mir funktioniert sie, kannst du sie bitte nochmal prüfen?

    Michael Kliewe

    19 Apr 11 at 14:30

  3. 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

Leave a Reply

You can add images to your comment by clicking here.