何か間違っている必要があります。 Web上のどこにでも自分の問題に対する答えを見つけることができないように見えます。これは一般的に、解決策がとても単純で誰も答えが必要ないことを意味します。Zend_Authログイン時に重複したDBセッションが作成される
セッションを保存するためにデータベースを使用しています。私はこのように私のブートストラップでそれを設定:
class Acl_Acl extends Zend_Controller_Plugin_Abstract{ public function preDispatch(Zend_controller_request_abstract $request){ $acl = new Zend_Acl(); //add roles $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); //add resources $acl->addResource("index"); $acl->addResource("authenticate"); $acl->addResource("error"); $acl->addResource("employees"); $acl->addResource("mold"); $acl->addResource("search"); $acl->addResource("shop"); $acl->addResource("user"); //access rules $acl->allow(null,array('index','error','authenticate')); //default resources //Guest member access $acl->allow(Acl_Levels::$GUEST,'mold',array('index','list-molds')); $acl->allow(Acl_Levels::$GUEST,'user',array('index','login','new-profile','my-profile')); //SHOP Member Access $acl->allow(Acl_Levels::$BASIC,'mold',array('get-mold','get-part','get-order','get-orders','get-parts','print-mold-labels','print-part-labels')); $acl->allow(Acl_Levels::$BASIC,'user',array('my-profile','profile')); //OFFICE Member Access //EXECUTIVE Member Access //OWNER Member Access //ADMIN Member Access //current user if(Zend_Auth::getInstance()->hasIdentity()){ $level = Zend_Auth::getInstance()->getIdentity()->level; } else { $level = Acl_Levels::$GUEST; } $conroller = $request->controller; $action = $request->action; try { if(!$acl->isAllowed($level,$conroller,$action)){ $request->setControllerName('application-error'); $request->setActionName('not-authorized'); } } catch (Exception $e){ $request->setControllerName("application-error"); $request->setActionName("error"); $error = new Zend_Controller_Plugin_ErrorHandler(); $error->type = Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER; $error->request = clone($request); $error->exception = $e; $request->setParam('error_handler',$error); } } }
私認証コントローラが持っている:私のブートストラップで
protected function _initDBSessions(){ $resource = $this->getPluginResource('db'); //from 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'); $options = array( "strict"=>FALSE, "name"=>"eCubed", "use_cookies"=>FALSE ); Zend_Session::setOptions($options); Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config)); }
次は
protected function _initPlugins(){ Zend_Controller_Front::getInstance()->registerPlugin(new Acl_Acl()); }
私のプラグインの設定である私のAcl_Aclは、このようになります次のアクション:
public function 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('password'); $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); $nickname = $identity->nickname ? $identity->nickname : $identity->first_name; $this->_helper->flashMessenger("Welcome back $nickname"); //Zend_Debug::dump($identity); exit; $this->_redirect("/"); } else { $this->_helper->flashMessenger("Unable to log you in. Please try again"); $this->_redirect("/"); } } } }
私のデータベース構造: ID:int型 修正: 寿命をint型: データをint型:テキスト
すべての権利、よくありますか?まあ、いいえ...
まず、ログインしていないユーザーがページを更新またはナビゲートするたびにセッションが作成されます。これは
私が持っている問題は、私が最終的にログインしないとき、私は...
データベースが完全にZend_AuthのアイデンティティとFlashmessengerを記憶していることを確認することができますが、ということです...私は推測する、許容可能です。 ..それはデータベース内のファントムローを作成します。ユーザーがログインしていない人がウェブサイトをナビゲートしている場合...
これは、ユーザーが「プロフィール」ページにリダイレクトされると、Zendは絶対にデータが入っていないファントムセッションのデータを見ています!
以下ものが格納されていることを証拠としてZend_Sessionのデータベーステーブルに格納された情報である。
にZend_Authは|:1:{S:7: "ストレージ"; O:8: "はstdClass":7: {s:2: "id"; s:1: "2"; s:5: "email"; s:17: "wes @* *** .com"; s:10: "first_name s:5: "level"; s:5: "basic"; s:8: "Wesley"; s:9: "last_name"; s:7: "*" "ニックネーム"; s:3: "Wes"; s:9: "lastlogin"; s:19: "2011-07-14 19:30:36";}} __ZF | a:1:{s:14: FlashMessenger | a:1:{s:7: "default"; a:1:{i:0; s:16} "FlashMessenger"; a:1:{s:4: "ENNH"; i: : "Welcome back Wes";}}
これは今、2日間ナッツを運転しています。私はZend_Sessionが自動的にセッションを1つだけ使用してデータを保存するという印象を受けていますが、これらの複数のエントリが私を怒らせています!!
私は、仕事をするのに十分な情報を誰かに与えて欲しいと思います。