为了方便讲解与引用,将认证类放在Album模块的模型目录下。用户认证的方式有多种,在这里介绍的一种是作者在开发中常用到的一种,数据库认证的持久性认证。ZF2中的持久性认证其本质还是通过Session来实现的,只不过开发者在开发的时候根据就不会察觉到Session在这期间的存在。ZF2在使用持久性认证的时候如果没有对认证空间进行重新命名,ZF2使用使用一个Zend_auth为其Session的默认命名空间,当你在new一个认证的实例的时候系统会自动的找到Zend_auth对应的Session命名空间。在此也可以看认证类与其他类在进行new 的时候可能会有所不同,这种不同也正是由于Session的相关机制所带来的。
添加文件:/module/Album/src/Album/Model.MyAuth.php
,具体内容如下:
namespace Album\Model;
use Zend\Db\Adapter\Adapter as DbAdapter;
use Zend\Authentication\Adapter\DbTable as AuthAdapter;
use Zend\Authentication\AuthenticationService;
class MyAuth {
protected $adapter;
public function __construct() {
$this->adapter = new DbAdapter(array(
'driver'=>'Pdo_Mysql',
'database'=>'test',
'host'=>'localhost',
'username'=>'root',
'password'=>''
));
}
public function auth() {
$authAdapter = new AuthAdapter($this->adapter);
$authAdapter
->setTableName('user') // 认证的数据表
->setIdentityColumn('username') // 认证字段
->setCredentialColumn('password'); // 校验字段
$authAdapter
->setIdentity('admin') // 认证值
->setCredential('admin');// 校验值
$auth = new AuthenticationService();
$result = $auth->authenticate($authAdapter);
if($result->isValid()){
$auth->getStorage()->write($authAdapter->getResultRowObject());
return true;
}
return false;
}
public function isAuth(){
$auth = new AuthenticationService();
if($auth->hasIdentity()) return true;
return false;
}
}
代码解释:
public function auth() {} 进行认证
public function isAuth(){} 通过持久性认证判断是否已经通过认证
$authAdapter = new AuthAdapter($this->adapter); 实例为一个认证适配器
$auth = new AuthenticationService(); 实例化一个认证服务,以实现持久性认证