0

我正在学习 Zend 框架并且遇到了 Zend_Session_Namespace 的问题。

这是场景:

  1. 主页(用户点击登录-索引控制器)
  2. 登录页面(用户身份验证完成->登录控制器)
  3. 成功登录时:创建一个新的 zend_Session_Namespace("login") 并用主页按钮将他带到另一个页面。
  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";
            }
        }
    }
    

谢谢你。

4

1 回答 1

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/

祝你好运!

于 2013-05-13T11:03:43.770 回答