在登录操作中,我有以下代码:
public function login($sEmail, $sEncryptedPassword, $bIsClear = true)
{
$manager = $this->getServiceLocator()->get('session_manager');
$manager->start();
Container::setDefaultManager($manager);
$this->auth = new AuthenticationService();
$this->auth->setStorage(new Session('FSP'));
$dbAdapter = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter');
$this->authAdapter = new AuthAdapter(
$dbAdapter,
'fsp_user',
'email',
'password'
);
$this->authAdapter
->setIdentity($sEmail)
->setCredential($sEncryptedPassword);
$authAuthenticate = $this->auth->authenticate($this->authAdapter);
if ($authAuthenticate->isValid()) {
$user = $this->authAdapter->getResultRowObject();
$storage = $this->auth->getStorage();
$storage->write(
array(
'email' => $user->email,
'first_name' => $user->first_name,
'last_name' => $user->last_name,
'id' => $user->id
)
);
}
我对此代码有两个问题: 1)我将会话保存在数据库中,并在服务管理器中配置会话SaveHandler。我不知道一旦我使用Zend \ Authenticate我也应该使用会话管理器。在文档中说
“除非另有说明,否则Zend \ Authentication \ AuthenticationService 使用名为Zend \ Authentication \ Storage \ Session的存储类,其中, 反过来,使用Zend \ Session。“
所以我的第一个问题是:我可以仅使用Zend \ Authenticate配置sessionHandler,还是必须使用会话管理器?
2)我无法弄清楚会话存储在ZF中是如何工作的。登录后,会话数据不会保留在DB中。如果我正在进行一些调试,我会得到以下数据:
$session = new Container("FSP");
//this returns the session data
var_dump($session->getIterator());
//this returns empty
var_dump($this->auth->getStorage());
//this returns null, but I do have a FSP named cookie with an Id, showing in Chrome's developer tool
$cookie = $this->getServiceLocator()->get('request')->getHeaders()->get('cookie');
$sessionId = $cookie->FSP;
var_dump($sessionId);
但是,如果我正在对登录进行刷新(再次运行登录操作),则会在数据库中写入上一个会话中的数据,而不是当前数据中的数据。 所以第二个问题是,为什么会话数据在登录时没有持久存储在数据库中,在会话实例化过程的哪一步是创建会话ID的cookie?