2011-07-20 14 views
1

何か間違っている必要があります。 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つだけ使用してデータを保存するという印象を受けていますが、これらの複数のエントリが私を怒らせています!!

私は、仕事をするのに十分な情報を誰かに与えて欲しいと思います。

答えて

1

私は劇的にここに答えを書く方法を知りませんが、問題だった

...予想通り...

をこの問題を考え出し、解決策は単純タイプミスでした。 ..

"セッション"と呼ばれるデータベーステーブルに間違ったデータ型がありました。

は、ID列のデータ型は、 "INT"(11)

代わり

それが "チャー"(32)

DUHを設定しなければならないとしました!私はこの問題に費やした4日間が他の誰かを助けることを願っています!

関連する問題