Zend_Auth登录时创建的重复数据库会话



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

我正在使用数据库来存储我的会话。我在我的引导程序中设置如下:

protected函数_initDBSession(){$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=数组('name'=>'sessions','primary'=>'id','modifiedColumn'=>'modified','dataColumn'=>'data','lifetimeColumn'=>'lifetime');$options=数组("strict"=>FALSE,"name"=>"eCubed","use_cookies"=>FALSE);Zend_Session::setOptions($options);Zend_Session::setSaveHandler(新的Zend_Session_SaveHandler_DbTable($config));}

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

protected函数_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(新的Zend_acl_Role(acl_Level::$GUEST));$acl->addRole(新的Zend_acl_Role(acl_Level::$BASIC),acl_Levels::$GUEST);$acl->addRole(新的Zend_acl_Role(acl_Level::$SHOP),acl_Levels::$BASIC);$acl->addRole(新的Zend_acl_Role(acl_Level::$OFFICE),acl_Levels::$SHOP);$acl->addRole(新的Zend_acl_Role(acl_Level::$EXECUTIVE),acl_Levels::$OFFICE);$acl->addRole(新的Zend_acl_Role(acl_Level::$OWNER));$acl->addRole(新的Zend_acl_Role(acl_Level::$ADMIN),acl_Levels::$OWNER);//添加资源$acl->addResource("index");$acl->addResource("authenticate");$acl->addResource("error");$acl->addResource("雇员");$acl->addResource("mold");$acl->addResource("搜索");$acl->addResource("商店");$acl->addResource("user");//访问规则$acl->allow(null,array('index','error','authenticate'))//默认资源//访客会员访问$acl->allow(acl_Levels::$GUEST,'mold',array('index','list-molds'));$acl->allow(acl_Level::$GUEST,'user',array('index','login','new-profile','my-profile');//SHOP会员访问$acl->allow(acl_Levels::$BASIC,'mold',array('get-mold','get-part','set-order','et-order','get_part','打印-mold-labels','打印-part-labels');$acl->allow(acl_Level::$BASIC,'user',array('my-profile','profile'));//OFFICE成员访问//执行成员访问//业主成员访问//ADMIN成员访问//当前用户if(Zend_Auth::getInstance()->hasIdentity()){$level=Zend_Auth::getInstance()->getIdentity()->level;}其他{$level=Acl_Levels::$GUEST;}$conroller=$request->controller;$action=$request->action;尝试{if(!$acl->isAllowed($level,$conroller,$action)){$request->setControllerName("application-error");$request->setActionName('未授权');}}catch(异常$e){$request->setControllerName("应用程序错误");$request->setActionName("error");$error=新的Zend_Controller_Plugin_ErrorHandler();$error->type=Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER;$error->request=克隆($request);$error->exception=$e;$request->setParam('error_handler',$error);}}}

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

公共函数loginAction(){$this->_helper->viewRenderer->setNoRender(TRUE);$loginForm=新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()){$省略=数组('password','timestamp','emp_password','active','created');$identity=$authAdapter->getResultRowObject(NULL,$省略);$authStorage=Zend_Auth::getInstance()->getStorage();$authStorage->写入($identity);$昵称=$identity->昵称$identity->昵称:$identity->first_name;$this->_helper->flashMessenger("欢迎返回$昵称");//Zend_Debug::dump($identity);出口$this->_redirect("/");}其他{$this->_helper->flashMessenger("无法登录。请重试");$this->_redirect("/");}}}}

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

一切都很好,对吧?不…

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

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

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

这使得身份验证变得不可能,因为当用户重定向到"Profile"页面时,例如,Zend正在查看完全不包含数据的虚幻会话数据!

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

Zend_Auth|a:1:{s:7:"存储";O:8:"stdClass":7:{s:2:"id";s:1:"2";s:5:"电子邮件";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:"上次登录";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:"默认";a:1:{i:0;s:16:"欢迎回来Wes";}}

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

我希望我已经给某人提供了足够的信息。

我解决了这个问题。。。

不出所料,解决方案只是一个简单的打字错误。。。

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

我的数据库表,称为"会话",有错误的数据类型。

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

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

啊!我希望我花在这个问题上的4天时间能帮助其他人!

相关内容

  • 没有找到相关文章

最新更新