Zend сессия и Zend auth


Я сделал систему входа через zend auth вот код

// userAuthentication
   public function authAction(){
       $request     = $this->getRequest();
       $registry    = Zend_Registry::getInstance();
       $auth        = Zend_Auth::getInstance(); 
       $DB = $registry['DB'];
           $authAdapter = new Zend_Auth_Adapter_DbTable($DB);
               $authAdapter->setTableName('user')
                            ->setIdentityColumn('user_name')
                            ->setCredentialColumn('user_password');

      $username = $request->getParam('username');
      $password = $request->getParam('password');
      $authAdapter->setIdentity($username);
      $authAdapter->setCredential($password);
      $result = $auth->authenticate($authAdapter);

      if($result->isValid()){
           $data = $authAdapter->getResultRowObject(null,'password');
           $auth->getStorage()->write($data);
           $this->_redirect('/login/controlpannel');
       }else{
           $this->_redirect('/login/login');
        }
  }

Теперь это прекрасно работает. Есть user_id (столбец) в user (таблица), где также есть имя пользователя и пароль. Мне нужно получить этот конкретный user_id из этой таблицы, который просто войти и поместить его в сеанс через

$user_session = new Zend_Session_Namespace('user_session');
$user_session->username = $username;
$user_id->user_id       = $user_id;

Так что я могу запросить некоторую информацию против этого $user_id и передать результат в view (name) controlpanel

6 5

6 ответов:

Получить идентификатор пользователя из хранилища:

$userInfo = Zend_Auth::getInstance()->getStorage()->read();

echo $userInfo->user_id;

Хотя на этот вопрос уже был дан ответ, я склонен использовать функцию getIdentity() чаще, чем цепочку getStorage()->read(). Примеры ниже.

// to check if authenticated
Zend_Auth::getInstance()->hasIdentity();

// to actually get the details from storage
Zend_Auth::getInstance()->getIdentity()->user_id;

// if I need to use the identity over and over
$identity = Zend_Auth::getInstance()->getIdentity();
$userId = $identity->user_id;

Вы можете получить доступ к данным так, как предлагает Teez, или просто вытащить их из Zend_Session_Namespace.

15.1.3.1. Сохранение по умолчанию в сеансе PHP
по умолчанию Zend_Auth обеспечивает постоянное хранение идентификатора от успешного пользователя. попытка аутентификации с использованием сеанса PHP. При удачном исходе попытка аутентификации, Zend_Auth:: authenticate() сохраняет идентификатор из результата аутентификации в постоянное хранилище. Если настроено иначе, Zend_Auth использует класс хранения с именем Zend_Auth_Storage_Session, который, в свою очередь, использует Zend_Session. Традиция класс может вместо этого использоваться путем предоставления объекта, реализующего Zend_Auth_Storage_Interface к Zend_Auth:: setStorage ().

Zend_Auth_Storage_Session использует пространство имен сеанса 'Zend_Auth'. Это пространство имен может быть переопределено путем передачи другому значению конструктор Zend_Auth_Storage_Session, и это значение внутренне передано вместе с конструктором Для. Это должно быть происходят до попытки аутентификации, так как Функция Zend_Auth:: authenticate () выполняет автоматическое хранение идентичность.

Назначая массив сеансу, вы должны указать имя сеанса, который вы создаете, то есть вы должны сделать setStorage, прежде чем делать getStorage.

Вы должны написать свой код следующим образом:

   // userAuthentication
   public function authAction(){
       $request     = $this->getRequest();
       $registry    = Zend_Registry::getInstance();
       $auth        = Zend_Auth::getInstance(); 
       $DB = $registry['DB'];
           $authAdapter = new Zend_Auth_Adapter_DbTable($DB);
               $authAdapter->setTableName('user')
                            ->setIdentityColumn('user_name')
                            ->setCredentialColumn('user_password');


      $username = $request->getParam('username');
      $password = $request->getParam('password');
      $authAdapter->setIdentity($username);
      $authAdapter->setCredential($password);
      $authAdapter->setStorage(new Zend_Auth_Storage_Session('User_Auth'));
      $result = $auth->authenticate($authAdapter);
      if($result->isValid()){
      $data = $authAdapter->getResultRowObject(null,'password');
       $auth->getStorage()->write($data);
       $this->_redirect('/login/controlpannel');
       }else{
           $this->_redirect('/login/login');
        }
  }

И затем, чтобы получить значение хранилища, вы должны использовать следующее:

$x = new Zend_Auth_Storage_Session('User_Auth');
$y = $x->read();

И вы получаете все в $y как объект.

Наслаждайтесь!

Это мой подход, и он хорошо работает.: 1-я начинаю с определения функции init в bootstrap

protected function _initSession()
{

    $UserSession = new Zend_Session_Namespace('UserSession');
    $UserSession->setExpirationSeconds(/* you may fix a limit */);
    Zend_Registry::set('UserSession', $UserSession);
}

/* в действии входа в систему,после правильного имени пользователя & pwd * /

 // Create session
    $UserSession = Zend_Registry::get('UserSession');
 // Get the user from database 
 $db = Zend_Db_Table::getDefaultAdapter();
 $user = $db->fetchRow("SELECT * FROM user_table WHERE user_email = '".$user_email."'");

 //then you assign to $user to $UserSession variable : 
 $UserSession->user = $user;

 //finaly don't forget to unset session variable in the Logout action ...

User = Zend_Auth:: getInstance () - >getIdentity(); если(!@$этот пользователь){ $objSession - >errorMsg = " пожалуйста, войдите первым .. ! "; $this - >_redirect ('/user / login'); } ?>