我一定做错了什么。我似乎无法在网络上的任何地方找到我的问题的答案,这通常意味着解决方案非常简单,没有人需要答案。
我正在使用数据库来存储我的会话。我在我的引导程序中设置它是这样的:
受保护的函数 _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 个会话来存储数据,但是这些多个条目让我发疯!
我希望我已经给了某人足够的信息来工作。