今天用Zend Framework搞了一下身份持久认证...
手册里头提供了四种认证方式,一个是session,一个是数据库表,一个摘要式,最后一愕是HTTP认证适配器。我在实现session认证的时候(按照手册上的代码),起初发现了一个问题,无法验证...后来仔细看了一下,手册上的代码缺少了点东西...
Zend_Auth结合Zend_Auth_Storage_Session实现session的持久身份认证,主要有一下几点:
1、先做个适配器,也就是自己用来验证用户的类,如:
class AuthAdapter implements Zend_Auth_Adapter_Interface{
var $username;
var $password;
/**
* Sets username andpassword for authentication
* @return void
*/
public function __construct($username='', $password=''){//
$this->username = $username;
$this->password = $password;
}
/**
* Performs an authentication attempt
* @throws Zend_Auth_Adapter_Exception If authentication cannot be performed
* @return Zend_Auth_Result
* Zend_Auth_Result::SUCCESS
* Zend_Auth_Result::FAILURE
* Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND
* Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS
* Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID
* Zend_Auth_Result::FAILURE_UNCATEGORIZED
*/
public function authenticate(){
$aryInfo;
if (isset($this->username) && (isset($this->password))){
$aryInfo[0] = _e('验证正确');
return new Zend_Auth_Result(1,$aryInfo);
}else{
$aryInfo[0] = _e('验证失败');
return new Zend_Auth_Result(-1,$aryInfo);
}
}
}
2、在获取一个Zend_Auth的实例
$auth = Zend_Auth::getInstance();
3、创建认证session的命名空间,并放到Zend_Auth的实例的存储器中
$auth->setStorage(new Zend_Auth_Storage_Session('someNamespace'));
4、加入上面的认证适配器实例:
include ('../classes/authadapter.class.php');
$authAdapter = new AuthAdapter('usrname', 'pwd');
$result = $this->_auth->authenticate($authAdapter);
5、判断验证结果:
if (!$result->isValid()) {
foreach ($result->getMessages() as $message){
echo "$message/n";
}
}else{
foreach ($result->getIdentity() as $message){
echo "$message/n";
}
}
如果在其他页面去验证的时候直接调用一个方法就可以验证了:
$auth = Zend_Auth::getInstance();
$auth->setStorage(new Zend_Auth_Storage_Session('sessionAuth'));
if ($auth->hasIdentity()){
$identity = $auth->getIdentity();
echo '认证';
}else{
echo '未认证';
foreach ($auth->getIdentity() as $message){
echo "$message/n";
}
其实按照我的理解,采用什么样的方式去验证,只要在适配器验证方法中去决定就可以了...
对于身份持久,最好与ACL配合好使用才好...否则对于权限和资源的访问控制还是会有很多问题...
还有一个重要的问题,从根本上来讲,无论那种验证方式,还都是和session有很大关系的,除非在每次验证的时候都去调用验证的原始方法,而不是只根据验证session中取出来的值,当然,session中的值会作为验证信息的依据。
另外几种验证方法,再看看,也许会有更好更合适的,到时候再分享。