Как передать _SESSION ('userName') из этого метода Zend_Auth в макет? - PullRequest
0 голосов
/ 02 августа 2010

Мне трудно понять, как Zend_Session_Namespace интегрирован с Zend_Auth. У меня есть этот метод, который я использую в качестве действия для аутентификации моей страницы входа - он работает правильно и перенаправляет на представление / month:

 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('users')
                ->setIdentityColumn('UserName')
                ->setCredentialColumn('Password');    

// Set the input credential values
    $uname = $request->getParam('UserName');
    $paswd = $request->getParam('Password');
    $authAdapter->setIdentity($uname);
    $authAdapter->setCredential($paswd);

   // Perform the authentication query, saving the result
    $result = $auth->authenticate($authAdapter);

       // TRYING TO SET THE NAMESPACE
        $this->session = new Zend_Session_Namspace('UserName');

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

    }else{
        $this->_redirect('/login');
    }
}

Но мне нужно иметь возможность хранить UserName как Zend_session и вызывать его из ежемесячного контроллера. Я не все делаю правильно, потому что у меня просто появляется пустой экран, когда я пытаюсь сделать это:

public function indexAction()
{

$this->view->userName = Zend_Session_Namespace('UserName');
}

Ответы [ 3 ]

1 голос
/ 02 августа 2010

Со строками:

$data = $authAdapter->getResultRowObject(null,'password');
$auth->getStorage()->write($data);

Вы пишете всю информацию пользователя, кроме пароля, который в порядке.Где бы вам ни понадобился доступ к зарегистрированным данным пользователя, вы можете сделать что-то вроде (обновлено в соответствии с вашим комментарием):

public function indexAction() {
    $auth = Zend_Auth::getInstance();
    if($auth->hasIdentity()) {
        $userData = $auth->getIdentity();
        $this->view->user = $userData;
    }
}

в файле просмотра (index.phtml) просто: echo $this->user->firstname

Вот и все.Если однажды вы решите изменить хранилище для Zend_Auth из сеанса, например, на базу данных, этот фрагмент кода все равно будет работать.

1 голос
/ 02 августа 2010

Вы не используете правильное пространство имен. Zend_Auth использует пространство имен Zend_Auth. Пространство имен - это структура, а не ключ для значения. поэтому ваша сессия выглядит примерно так:

Array('Zend_Auth' => array ('UserName' => 'myname')

Что ж, это не совсем точно, потому что вы не сохранили имя пользователя, если только вы не указали это непосредственно в своем адаптере. вам нужно сделать что-то вроде:

$auth->getStorage()->UserName = 'myusername';

Тогда вы можете получить доступ с помощью $authData = new Zend_Session_Namespace('Zend_Auth'); $username = $authData->UserName;.

Посмотрите, как работает Zend_Auth_Adapter_Db.

0 голосов
/ 05 июня 2013

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

protected function _initSession()

{

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

}

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

// Create session
$UserSession = Zend_Registry::get('UserSession'); 
// Get the user from database or just from fields
//you have to make sure that the psswd is encrypted use MD5 for example..
 $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 ...
...