1

在登录操作中,我有以下代码:

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?

4

0 回答 0