Повторяющиеся сеансы БД, созданные при входе в Zend_Auth - PullRequest
1 голос
/ 20 июля 2011

Я, должно быть, делаю что-то не так. Кажется, я не могу найти ответ на мою проблему в Интернете, и это обычно означает, что решение настолько простое, что никому не нужен ответ на него.

Я использую базу данных для хранения моего сеанса. Я установил его в своем загрузчике так:


    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 выглядит так:


    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);
            }

        }   
    }

Мой контроллер аутентификации выполняет следующие действия:


    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 в качестве доказательства того, что материал сохранен:

* 1 028 * Zend_Auth | а: 1: {s: 7: "хранение"; O: 8: "StdClass": 7: {s: 2: "ID"; s: 1: "2"; s: 5:» электронная почта "; s: 17:" Уэс @ **** .com "; s: 10:" first_name "; s: 6:" Уэсли "; s: 9: "last_name"; s: 7: "*"; s: 5: "уровень"; s: 5: "базовый"; 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: "Welcome back Wes" ;}} * * тысяча тридцать-семь

Это сводит меня с ума уже 2 дня. У меня сложилось впечатление, что Zend_Session автоматически использует только 1 сессию для хранения данных, но эти многочисленные записи сводят меня с ума!

Я надеюсь, что дал кому-то достаточно информации для работы.

1 Ответ

1 голос
/ 23 июля 2011

Я понял эту проблему ...

Как и ожидалось, решение было простой опечаткой ...

Я не знаю, как резко написать ответ, но проблема была ...

Моя таблица базы данных, называемая "сессиями", имела неправильный тип данных.

Тип данных для столбца id был установлен как "int" (11)

вместо этого должно быть установлено значение "char" (32)

ДУХ! Я надеюсь, что 4 дня, которые я потратил на эту проблему, помогут кому-то другому!

...