Как работает хранилище Zend_Auth?

Это очень просто. я пишу

$auth->getStorage()->write($user);

И затем я хочу в отдельном процессе загрузить этого пользователя $, но я не могу, потому что

$user = $auth->getIdentity();

пусто. Разве я не просто ... УСТАНОВИЛ? Почему не работает? Холп?

[ИЗМЕНИТЬ 2011-04-13]

Об этом спрашивали почти два года назад. Однако факт в том, что я повторил этот вопрос в июле 2010 года и получил фантастический ответ, которого я тогда просто не понял.

Ссылка: Zend_Auth не выполняет запись в хранилище

С тех пор я создал очень хороший маленький класс, который я использую (иногда с дополнительной настройкой) во всех своих проектах, используя тот же механизм хранения, что и Zend_Auth, но избегая всего плохого.

<?php

class Qapacity_Helpers_Storage {

    public function save($name = 'default', $data) {

        $session = new Zend_Session_Namespace($name);
        $session->data = $data;

        return true;
    }

    public function load($name = 'default', $part = null) {

        $session = new Zend_Session_Namespace($name);

        if (!isset($session->data))
            return null;

        $data = $session->data;

        if ($part && isset($data[$part]))
            return $data[$part];

        return $data;
    }

    public function clear($name = 'default') {

        $session = new Zend_Session_Namespace($name);

        if (isset($session->data))
            unset($session->data);

        return true;
    }

}

?>

person John    schedule 17.09.2009    source источник
comment
Другая проблема может заключаться в том, что хранилище (и Zend_Auth) не имеют одинаковой конфигурации. Пишу в одном месте, читаю в другом.   -  person AsTeR    schedule 15.02.2012


Ответы (3)


Это должно работать.

Вот реализация функции Auth getIdentity.

/**
 * Returns the identity from storage or null if no identity is available
 *
 * @return mixed|null
 */
public function getIdentity()
{
    $storage = $this->getStorage();

    if ($storage->isEmpty()) {
        return null;
    }

    return $storage->read();
}

Вот реализация функций записи и чтения PHP Session Storage:

/**
 * Defined by Zend_Auth_Storage_Interface
 *
 * @return mixed
 */
public function read()
{
    return $this->_session->{$this->_member};
}

/**
 * Defined by Zend_Auth_Storage_Interface
 *
 * @param  mixed $contents
 * @return void
 */
public function write($contents)
{
    $this->_session->{$this->_member} = $contents;
}

Вы уверены, что загружаете тот же экземпляр класса Zend_Auth?

Ты используешь

$auth = Zend_Auth::getInstance();

Может быть, вы вызываете метод записи после метода getIdentity?

В любом случае, как я уже сказал, то, что вы делаете, должно работать.

person Gaston    schedule 19.10.2009
comment
Что ж, я думаю, что проделал с этой штукой всевозможные эксперименты, и все, что у меня было, это психические синяки. По сути, я делал это по книге, затем с модификациями, затем с переписыванием, затем с абстрактными случайными экспериментами, не достигнув какого-либо связного вывода. При обновлении хранилища это сработало, но только в том случае, если пользователь перешел на ту же страницу, и, наконец, его можно будет использовать при следующем обновлении. Если бы у меня было перенаправление, оно не сработало бы, если бы оно не было в классе, который загружал другой класс, обновлял хранилище и т. Д. Я пришел к выводу, что это дерьмо абсолютно случайное. Спасибо хоть. - person John; 20.10.2009
comment
Просто чтобы подтвердить, что установка хранилища напрямую работает для меня. Я использую этот метод для принудительной идентификации в режиме отладки при отключении, чтобы я мог войти в систему со своей открытой страницей входа в систему идентификатора. Я думаю, что это проблема сеанса, как описано, ваша наиболее вероятная проблема. - person Jai; 24.03.2010

Значит, при перезагрузке страницы вы можете получить сеанс, но не при перенаправлении? Вы перенаправляете на другое доменное имя? Тогда это могут быть проблемы с файлами cookie, и вам придется вручную установить session.cookie_domain ini-переменную.

Проверить, правильно ли установлен файл cookie с именем PHPSESSID и отправляется ли он на сервер при каждом запросе страницы? Постоянно или меняется при каждом запросе?

Кроме того, вы можете проверить, правильно ли сохраняются данные сеанса на диск. Сессии можно найти в каталоге, определенном ini-переменной session.save_path. Есть ли там файл, соответствующий вашему PHPSESSID, и содержит ли он значимую запись? В моем случае он содержит

root@ip-10-226-50-144:~# less /var/lib/php5/sess_081fee38856c59a563cc320899f6021f 
foo_auth|a:1:{s:7:"storage";a:1:{s:9:"user_id";s:2:"77";}}
person Silvan Mühlemann    schedule 21.10.2009
comment
Ноно, это тот же домен. Я все же проверю куки. К этому времени я почти уверен, что это может быть что угодно, включая глобальное потепление, хех. - person John; 22.10.2009

Добавлять:

register_shutdown_function('session_write_close');

до index.php перед:

$application->bootstrap()->run();
person Piotr Szymaniak    schedule 01.08.2014
comment
Это не помогло - person rodrigo-silveira; 03.10.2016