Zend Framework学习之自定义认证适配器

要实现自定义认证适配器,只需要定义一个类,继承Zend_Auth_Adapter_Interface接口即可。在该类中需要为该类指定authenticate()方法,并返回一个Zend_Auth_Result对象。

代码:

<?php
require_once 'Zend/Auth/Adapter/Interface.php';
class MyAdapter implements Zend_Auth_Adapter_Interface{
    protected $_username;
    protected $_password;
    public function __construct($username = null,$password = null){

    }
    public function getUsername(){
        return $this->_username;
    }
    public function getPassword(){
        return $this->_password;
    }
    public function setUsername($username){
        $this->_username = $username;
        return $this;
    }
    public function setPassword($password){
        $this->_password = $password;
        return $this;
    }
    public function authenticate(){//进行验证
        if($this->_username == null or $this->_password == null){
            require_once 'Zend/Auth/Adapter/Exception.php';
            throw new Zend_Auth_Adapter_Exception("没有指定用户名与密码!");
        }else{
            //定义结果数组
            $result = array(
                    'code'=>Zend_Auth_Result::FAILURE,
                    'identity'=>array(
                            'username'=>$this->_username,
                            'password'=>$this->_password
                        ),
                    'messages'=>array()
                );
            if($this->_username=='bill' and $this->_password == '12345'){
                $result['code']=Zend_Auth_Result::SUCCESS;
            }else{
                $result['code']=Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID;
                $result['messages'][] = "提供的用户名或密码不正确";
            }
            return new Zend_Auth_Result($result['code'],$result['identity'],$result['messages']);
        }
    }
}
$my_adapter = new MyAdapter();
$my_adapter ->setUsername("1234");
$my_adapter ->setPassword("zzzzz");
$result = $my_adapter->authenticate();
if(!$result->isValid()){
    echo "使用".$my_adapter->getUsername()."与".$my_adapter->getPassword();
    echo "不能通过验证";
    echo "<p>原因为:";
    print_r($result->getMessages());
}else{
    echo "使用".$my_adapter->getUsername()."与".$my_adapter->getPassword();
    echo "成功通过验证!";
}
echo "<p>";
$my_adapter ->setUsername("bill");
$my_adapter ->setPassword("12345");
$result = $my_adapter->authenticate();
if(!$result->isValid()){
    echo "使用".$my_adapter->getUsername()."与".$my_adapter->getPassword();
    echo "不能通过验证";
    echo "<p>原因为:";
    print_r($result->getMessages());
}else{
    echo "使用".$my_adapter->getUsername()."与".$my_adapter->getPassword();
    echo "成功通过验证!";
}

结果:

使用1234与zzzzz不能通过验证

原因为:Array ( [0] => 提供的用户名或密码不正确 )

使用bill与12345成功通过验证!

让我们来看看接口源代码

<?php
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Auth
 * @subpackage Zend_Auth_Adapter
 * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
 */


/**
 * @see Zend_Auth_Result
 */
require_once 'Zend/Auth/Result.php';


/**
 * @category   Zend
 * @package    Zend_Auth
 * @subpackage Zend_Auth_Adapter
 * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
interface Zend_Auth_Adapter_Interface
{
    /**
     * Performs an authentication attempt
     *
     * @throws Zend_Auth_Adapter_Exception If authentication cannot be performed
     * @return Zend_Auth_Result
     */
    public function authenticate();
}

接口中引入了Result

同时定义了authenticate()方法

我们将它实现即可。

再看看Result的内容

<?php
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Auth
 * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: Result.php 24593 2012-01-05 20:35:02Z matthew $
 */


/**
 * @category   Zend
 * @package    Zend_Auth
 * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Auth_Result
{
    /**
     * General Failure
     */
    const FAILURE                        =  0;

    /**
     * Failure due to identity not being found.
     */
    const FAILURE_IDENTITY_NOT_FOUND     = -1;

    /**
     * Failure due to identity being ambiguous.
     */
    const FAILURE_IDENTITY_AMBIGUOUS     = -2;

    /**
     * Failure due to invalid credential being supplied.
     */
    const FAILURE_CREDENTIAL_INVALID     = -3;

    /**
     * Failure due to uncategorized reasons.
     */
    const FAILURE_UNCATEGORIZED          = -4;

    /**
     * Authentication success.
     */
    const SUCCESS                        =  1;

    /**
     * Authentication result code
     *
     * @var int
     */
    protected $_code;

    /**
     * The identity used in the authentication attempt
     *
     * @var mixed
     */
    protected $_identity;

    /**
     * An array of string reasons why the authentication attempt was unsuccessful
     *
     * If authentication was successful, this should be an empty array.
     *
     * @var array
     */
    protected $_messages;

    /**
     * Sets the result code, identity, and failure messages
     *
     * @param  int     $code
     * @param  mixed   $identity
     * @param  array   $messages
     * @return void
     */
    public function __construct($code, $identity, array $messages = array())
    {
        $code = (int) $code;

        if ($code < self::FAILURE_UNCATEGORIZED) {
            $code = self::FAILURE;
        } elseif ($code > self::SUCCESS ) {
            $code = 1;
        }

        $this->_code     = $code;
        $this->_identity = $identity;
        $this->_messages = $messages;
    }

    /**
     * Returns whether the result represents a successful authentication attempt
     *
     * @return boolean
     */
    public function isValid()
    {
        return ($this->_code > 0) ? true : false;
    }

    /**
     * getCode() - Get the result code for this authentication attempt
     *
     * @return int
     */
    public function getCode()
    {
        return $this->_code;
    }

    /**
     * Returns the identity used in the authentication attempt
     *
     * @return mixed
     */
    public function getIdentity()
    {
        return $this->_identity;
    }

    /**
     * Returns an array of string reasons why the authentication attempt was unsuccessful
     *
     * If authentication was successful, this method returns an empty array.
     *
     * @return array
     */
    public function getMessages()
    {
        return $this->_messages;
    }
}
authenticate()方法返回一个Result类的对象,这个对象可以查看是否验证成功。以及错误结果。

小结:剖析源代码能更好的使用它。
posted @ 2013-04-12 16:21  TBHacker  阅读(365)  评论(0编辑  收藏  举报