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类的对象,这个对象可以查看是否验证成功。以及错误结果。
小结:剖析源代码能更好的使用它。