2013-05-17 2 views
4

Я пытаюсь реализовать функцию memme для моего сайта ZF2 v2.2. Так вот что я сделал до сих пор: я создал сервис для менеджера сеансов, чтобы написать сессии в БД:ZF2 пользователь помню, что я не работал

'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; 
     } 
    } 

Но приложение еще не помнит меня .Что я делаю неправильно Вот ???

+0

Возможно, вы можете использовать или получить некоторые идеи из https://github.com/goalio/GoalioRememberMe –

ответ

9

Редактировать: OH ПРАВИЛЬНО, я помню. Память_me_seconds для сервера, но это не хорошо, если клиент удаляет файл cookie. Вы должны использовать как 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); 
    } 
} 
Смежные вопросы