Пользователь ZF2 помнит, что я не работаю
Я пытаюсь реализовать функцию Rememberme для моего сайта ZF2 v2.2. Итак, вот что я сделал до сих пор: я создал сервис для менеджера сеансов, чтобы записать сеанс в базу данных:
'session' => array(
'remember_me_seconds' => 2419200,
'use_cookies' => true,
'cookie_httponly' => true,
),
'session_manager' => function (ServiceManager $sm) {
$adapter = $sm->get('db_adapter');
$config = $sm->get('app_config');
$sessionOptions = new Session\SaveHandler\DbTableGatewayOptions();
$sessionTableGateway = new TableGateway('tbl_session', $adapter);
$saveHandler = new Session\SaveHandler\DbTableGateway($sessionTableGateway, $sessionOptions);
$sessionConfig = new Session\Config\SessionConfig();
$sessionConfig->setCookieDomain(ACTIVE_SITE);
$sessionConfig->setCookieSecure(true);
$sessionConfig->setOptions($config['session']);
$sessionManager = new Session\SessionManager($sessionConfig, NULL, $saveHandler);
$sessionManager->start();
return $sessionManager;
},
И использовал этот менеджер сессий для моих сессий и AuthenticationService
:
Session\Container::setDefaultManager($sm->get('session_manager'));
'user_auth_service' => function (ServiceManager $sm) {
$authService = new \Zend\Authentication\AuthenticationService();
$session = new \Zend\Authentication\Storage\Session(null, null, $sm->get('session_manager'));
$authService->setStorage($session);
return $authService;
},
И в моей форме входа я использую запомнить меня:
public function login(\User\Model\User $user)
{
$authAdapter = $this->getServiceLocator()->get('user_auth_adapter');
$authAdapter->setIdentity($user->username);
$authAdapter->setCredential($user->password);
/* @var $authService \Zend\Authentication\AuthenticationService */
$authService = $this->getServiceLocator()->get('user_auth_service');
$result = $authService->authenticate($authAdapter);
switch ($result->getCode()) {
case \Zend\Authentication\Result::FAILURE_IDENTITY_NOT_FOUND:
case \Zend\Authentication\Result::FAILURE_CREDENTIAL_INVALID:
return $result->getMessages();
break;
case \Zend\Authentication\Result::SUCCESS:
$user = $authAdapter->getResultRowObject(null, 'password');
$user->rolls = $this->getServiceLocator()->get('user_role_table')->getRoles($user->id);
$authService->getStorage()->write($user);
getSM()->get('session_manager')->rememberMe();
return true;
break;
default:
return 'Invalid Credential Provided !';
break;
}
}
Но приложение до сих пор не помнит меня. Что я здесь не так делаю???
1 ответ
Редактировать: О, я помню сейчас. Remember_me_seconds для сервера, но это не хорошо, если клиент удаляет куки. Вы должны использовать и cookie_lifetime, и опцию запомнить, чтобы установить соответствующие значения. Попробуйте следующее.
session' => array(
'cookie_lifetime' => 2419200, //SEE ME
'remember_me_seconds' => 2419200, //SEE ME
'use_cookies' => true,
'cookie_httponly' => true,
),
Дайте мне знать, если это работает.
Не обращайте внимания на следующее.
Я не думаю, что опция Remember_me работает. Я взглянул на код ZF2 и вот некоторые признаки того, что он бесполезен. Ищите //SEE ME
комментарий.
public function setStorageOption($storageName, $storageValue)
{
$key = false;
switch ($storageName) {
// SEE ME
case 'remember_me_seconds':
// do nothing; not an INI option
return;
case 'url_rewriter_tags':
$key = 'url_rewriter.tags';
break;
default:
$key = 'session.' . $storageName;
break;
}
$result = ini_set($key, $storageValue);
if (FALSE === $result) {
throw new \InvalidArgumentException("'" . $key .
"' is not a valid sessions-related ini setting.");
}
return $this;
}
/**
* Retrieve a storage option from a backend configuration store
*
* Used to retrieve default values from a backend configuration store.
*
* @param string $storageOption
* @return mixed
*/
public function getStorageOption($storageOption)
{
switch ($storageOption) {
// SEE ME
case 'remember_me_seconds':
// No remote storage option; just return the current value
return $this->rememberMeSeconds;
case 'url_rewriter_tags':
return ini_get('url_rewriter.tags');
// The following all need a transformation on the retrieved value;
// however they use the same key naming scheme
case 'use_cookies':
case 'use_only_cookies':
case 'use_trans_sid':
case 'cookie_httponly':
return (bool) ini_get('session.' . $storageOption);
default:
return ini_get('session.' . $storageOption);
}
}