在登录操作中,我有以下代码:
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 中的会话存储是如何工作的。登录后,会话数据不会保存在数据库中。如果我正在做一些调试,我会得到以下数据:
$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?