Zend сеанс сбрасывается, когда пользователь переключается между страницами

Я изучаю Zend Framework и имею проблемы с Zend_Session_Namespace.

Вот сценарий:

  1. Домашняя страница (пользователь нажимает на контроллер входа в систему)
  2. страница входа (аутентификация пользователя выполнена-> Контроллер входа)
  3. При успешном входе в систему: Создайте новый zend_Session_Namespace("вход в систему") и перенесите его на другую страницу с помощью кнопки домашней страницы.
  4. Пользователь нажимает кнопку домашней страницы. Я могу получить доступ к имени пользователя из сеанса и отобразить приветственное сообщение.
  5. Пользователь снова нажимает на страницу входа. Я проверяю isset($session->name), чтобы снова запретить вход и перевести его на другую страницу. -> Я терплю неудачу здесь. Сессия как-то сбрасывается, я совершенно не уверен, что мне не хватает.

    class IndexController extends Zend_Controller_Action
    {
        public function init()
        {
        }
    
        public function indexAction()
        {
             $session = new Zend_Session_Namespace("login_session");
              //Check if the session is already valid
             if(isset($session->name)) {
                $this->view->userLoggedIn="true";
                $this->view->name=$session->name;
             }
        }
    }
    
    
    class LoginController extends Zend_Controller_Action
    {
        public function loginaction(){
            $session = new Zend_Session_Namespace("login_session");
    
            if(isset($session->name)){
               //Redirect to New Page-Already Logged In
            } else {
               //Authenticate the user and if login is successful
               $session->name="USER_NAME";
            }
        }
    }
    

Благодарю вас.

1 ответ

Этот код выглядит хорошо, за исключением ранее упомянутой опечатки.

Возможно и вероятно, что где-то еще в вашем коде вы случайно перезаписали пространство имен сеанса. Я думаю, что мы все сделали это хотя бы один раз.

Я бы посоветовал вместо того, чтобы пытаться развернуть свое собственное решение для аутентификации, используйте то, которое предоставляет ZF: Zend_Auth

базовый вход / выход из Zend_Auth может выглядеть так:

//non production code for example only
public function loginAction()
    {
        $form = new Application_Form_Login();

        if ($this->getRequest()->isPost()) {
            if ($form->isValid($this->getRequest()->getPost())) {
                $data = $form->getValues();
                $authAdapter = new My_Auth_Adapter($data['username'], $data['password']);
                //authenticate
                $result = $authAdapter->authenticate();
                if ($result->isValid()) {
                    //store the user object
                    $auth = Zend_Auth::getInstance();
                    //access Zend_Auth session namespace
                    $storage = $auth->getStorage();
                    $storage->write($authAdapter->getUser());
                    //add message to flashmessenger
                    $this->message->addMessage('Welcome');
                    //redirect to the homepage
                    return $this->_redirect('/');
                } else {
                    //handle authentication errors
                    $this->view->loginMessage =
                        "Sorry, your username or password was incorrect";
                }
            } else {
                //handle form validation errors
                $this->_redirect('/users/index/register');
            }
        } else {
            //if not post render empty form
            $this->view->form = $form;
        }
    }

    public function logoutAction()
    {
        $authAdapter = Zend_Auth::getInstance();
        $authAdapter->clearIdentity();
    }

http://www.ens.ro/2012/03/20/zend-authentication-and-authorization-tutorial-with-zend_auth-and-zend_acl/

Удачи!

Другие вопросы по тегам