ログイン アクションでは、次のコードを使用しています。
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
)
);
}
このコードには 2 つの問題があります。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);
ただし、ログインで更新を行っている場合 (ログイン アクションが再度実行されます)、現在のセッションのデータではなく、前のセッションのデータが DB に書き込まれます。2 番目の質問は、ログイン時にセッション データがデータベースに保持されないのはなぜで、セッション インスタンス化プロセスのどのステップでセッション ID を持つ Cookie が作成されるのかということです。