1

我一定做错了什么。我似乎无法在网络上的任何地方找到我的问题的答案,这通常意味着解决方案非常简单,没有人需要答案。

我正在使用数据库来存储我的会话。我在我的引导程序中设置它是这样的:

    受保护的函数 _initDBSessions(){
        $resource = $this->getPluginResource('db'); //来自 config.ini?
        $db = $resource->getOptions();
        $adapter = new Zend_Db_Adapter_Pdo_Mysql($db["params"]);

        Zend_Db_Table_Abstract::setDefaultAdapter($adapter);
        $config = array('name'=>'sessions','primary'=>'id','modifiedColumn'=>'modified','dataColumn'=>'data','lifetimeColumn'=>'lifetime') ;
        $选项 = 数组(   
                “严格”=>错误,
                "名称"=>"eCubed",
                “use_cookies”=>假
                );
        Zend_Session::setOptions($options);
        Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
    }

我的引导程序中的下一个是我的插件设置

    受保护的函数 _initPlugins(){
        Zend_Controller_Front::getInstance()->registerPlugin(new Acl_Acl());
    }

我的 Acl_Acl 看起来像这样:

    类 Acl_Acl 扩展 Zend_Controller_Plugin_Abstract{

        公共函数 preDispatch(Zend_controller_request_abstract $request){
            $acl = 新 Zend_Acl();

            //添加角色
            $acl->addRole(new Zend_Acl_Role(Acl_Levels::$GUEST));
            $acl->addRole(new Zend_Acl_Role(Acl_Levels::$BASIC),Acl_Levels::$GUEST);
            $acl->addRole(new Zend_Acl_Role(Acl_Levels::$SHOP),Acl_Levels::$BASIC);
            $acl->addRole(new Zend_Acl_Role(Acl_Levels::$OFFICE),Acl_Levels::$SHOP);
            $acl->addRole(new Zend_Acl_Role(Acl_Levels::$EXECUTIVE),Acl_Levels::$OFFICE);
            $acl->addRole(new Zend_Acl_Role(Acl_Levels::$OWNER));
            $acl->addRole(new Zend_Acl_Role(Acl_Levels::$ADMIN),Acl_Levels::$OWNER);

            //添加资源
            $acl->addResource("index");
            $acl->addResource("认证");
            $acl->addResource("错误");
            $acl->addResource("员工");
            $acl->addResource("模具");
            $acl->addResource("搜索");
            $acl->addResource("shop");
            $acl->addResource("用户");

            //访问规则
            $acl->allow(null,array('index','error','authenticate')); //默认资源


            //访客会员访问
            $acl->allow(Acl_Levels::$GUEST,'mold',array('index','list-molds'));
            $acl->allow(Acl_Levels::$GUEST,'user',array('index','login','new-profile','my-profile'));

            //SHOP会员访问
            $acl->allow(Acl_Levels::$BASIC,'mold',array('get-mold','get-part','get-order','get-orders','get-parts','print -模具标签','打印部分标签'));
            $acl->allow(Acl_Levels::$BASIC,'user',array('my-profile','profile'));

            //OFFICE会员访问

            //EXECUTIVE会员访问

            //OWNER会员访问

            //管理员会员权限

            //当前用户
            if(Zend_Auth::getInstance()->hasIdentity()){
                $level = Zend_Auth::getInstance()->getIdentity()->level;
            } 别的 {
                $level = Acl_Levels::$GUEST;
            }

            $conroller = $request->控制器;
            $action = $request->action;

            尝试 {
                if(!$acl->isAllowed($level,$conroller,$action)){
                        $request->setControllerName('application-error');
                        $request->setActionName('未授权');
                }
            } 捕捉(异常 $e){
                $request->setControllerName("应用程序错误");
                $request->setActionName("错误");

                $error = new Zend_Controller_Plugin_ErrorHandler();
                $error->type = Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER;
                $error->request = clone($request);
                $错误->异常 = $e;
                $request->setParam('error_handler',$error);
            }

        }   
    }

我的身份验证控制器具有以下操作:

    公共函数 loginAction(){
            $this->_helper->viewRenderer->setNoRender(TRUE);

            $loginForm = new Form_Login();
            $form = $loginForm->getLoginForm();
            $form->setAction("/authenticate/login");

            if($this->getRequest()->isPost()){
                if($form->isValid($_POST)){
                    $email = $form->getValue('email');
                    $pass = $form->getValue('密码');

                    $authAdapter = $this->getAuthAdapter();
                    $authAdapter ->setIdentity($email)
                                    ->setCredential($pass);
                    $result = Zend_Auth::getInstance()->authenticate($authAdapter);

                    if($result->isValid()){
                        $omit = array('password','timestamp','temp_password','active','created');
                        $identity = $authAdapter->getResultRowObject(NULL,$omit);

                        $authStorage = Zend_Auth::getInstance()->getStorage();
                        $authStorage->write($identity);

                        $昵称 = $identity->昵称 ? $identity->昵称 : $identity->first_name;

                        $this->_helper->flashMessenger("欢迎回来 $nickname");

                        //Zend_Debug::dump($identity); 出口;
                        $this->_redirect("/");

                    } 别的 {
                        $this->_helper->flashMessenger("无法登录,请重试");
                        $this->_redirect("/");
                    }
                }
            }
        }

我的数据库结构:id:int 修改:int 生命周期:int 数据:文本

一切都很好,对吧?嗯,不...

首先,每次未登录的人刷新或导航到页面时,都会创建一个会话。这是可以接受的,我猜...

我遇到的问题是,当我最终登录时,我可以看到数据库正在完美地存储 Zend_Auth 身份和 Flashmessenger,但是......

...它还在数据库中创建了一个幻影行,就好像一个未登录的用户正在浏览该网站......

这使得身份验证变得不可能,因为当用户被重定向到“配置文件”页面时,例如,Zend 正在查看完全不包含任何数据的虚拟会话数据!

下面是存储在 Zend_Session 数据库表中的信息,作为存储内容的证据:

Zend_Auth|a:1:{s:7:"storage";O:8:"stdClass":7:{s:2:"id";s:1:"2";s:5:"email"; s:17:"wes@ * *** .com";s:10:"first_name";s:6:"Wesley";s:9:"last_name";s:7:" * ";s:5 :"level";s:5:"basic";s:8:"昵称";s:3:"Wes";s:9:"lastlogin";s:19:"2011-07-14 19:30 :36";}}__ZF|a:1:{s:14:"FlashMessenger";a:1:{s:4:"ENNH";i:1;}}FlashMessenger|a:1:{s:7 :"default";a:1:{i:0;s:16:"Wes come back";}}

这已经让我发疯了 2 天了。我的印象是 Zend_Session 自动只使用 1 个会话来存储数据,但是这些多个条目让我发疯!

我希望我已经给了某人足够的信息来工作。

4

1 回答 1

1

我想通了这个问题...

正如预期的那样,解决方案是一个简单的错字......

我不知道如何在这里戏剧性地写下答案,但问题是......

我的名为“会话”的数据库表的数据类型错误。

id 列的数据类型设置为“int” (11)

相反,它应该设置为“char”(32)

呃!我希望我在这个问题上花费的 4 天时间可以帮助其他人!

于 2011-07-22T20:01:52.233 回答