Файл cookie сеанса Magento, ключи формы работают неправильно. (пурпурный 1.8.1)

По какой-то причине после отладки я заметил, что form_keys действительны только после того, как я очистил кеш, выполнив ручную rm -rf * в папке var, очистив кеш браузера и повторив попытку сайта.

Я не вносил никаких изменений в основной код, я сравнил его с оригинальной установкой 1.8.1, и они точно такие же.

Первоначальная проблема заключалась в том, что клиенты не могли войти в систему, потому что я использовал файл customer/persistent/login.phtml из версии 1.7.0.2, и мне пришлось изменить его, чтобы добавить form_key в качестве скрытого элемента ввода, используя метод, показанный во всех других сообщениях о новое добавление ключей формы в magento 1.8.1.

У меня была включена капча, и по какой-то причине, когда я зашел в логин клиента, капча не отображается.

Случайно, я не знаю, что я сделал, страница обновилась, и отобразилась капча, и я смог войти в панель управления, и это сработало. Затем я вышел из системы, и возникла та же проблема: клиент входит в систему с правильным именем пользователя/паролем, но перенаправляется на ту же страницу входа клиента.

Я отладил loginPostAction в AccountController.php из app/code/core/mage/customer/controllers, и оказалось, что когда ключ формы действителен, после обновления кеша, очистки кеша в магии и браузере он достигает if( getIsJustConfirmed == true){ go to __welcomedashboard(..) }, однако getIsJustConfirmed возвращает null или false.

Я проверил, где установлен getIsJustConfirmed, и он появляется в setCustomer из Session.php внутри app/code/core/mage/customer/Session.php:

public function setCustomer(Mage_Customer_Model_Customer $customer)
    {
        // check if customer is not confirmed
        if ($customer->isConfirmationRequired()) {
            if ($customer->getConfirmation()) {
                return $this->_logout();
            }
        }
        $this->_customer = $customer;
        $this->setId($customer->getId());
        // save customer as confirmed, if it is not
        if ((!$customer->isConfirmationRequired()) && $customer->getConfirmation()) {
            $customer->setConfirmation(null)->save();
            $customer->setIsJustConfirmed(true);
        }
        return $this;
    }

первая часть !$customer->isConfirmationRequired() всегда возвращает true, однако $customer-->getConfirmation() возвращает null, поэтому не setIsJustConfirmed(true).


person Masu    schedule 17.06.2014    source источник


Ответы (2)


Как вы заметили, Magento 1.8 добавляет ключи формы ко многим формам. Ключ формы в скрытом поле ввода должен совпадать с ключом формы в сеансе пользователя. Это наносит ущерб любой форме кэширования, поскольку ключ формы, хранящийся в блочном или полном кэше страницы, вряд ли будет соответствовать ключу сеанса пользователя.

Во-первых, я предполагаю, что вы уже сравнили шаблоны, которые вы скопировали в пользовательскую тему, с базовыми версиями/версиями по умолчанию и добавили ключи формы везде, где они отсутствуют.

Затем следующее предложение — отключить все кэширование в Magento (и все кэши полных страниц, такие как Varnish) и посмотреть, решит ли это проблему. Это подтвердит, что вы где-то кэшируете ключи формы, и это является причиной вашей проблемы.

Затем используйте такой инструмент, как Advanced Template Hints от Fabrizio, чтобы узнать, кэшируются ли какие-либо шаблоны, содержащие ключ формы, явно или неявно через родительский блок. Если это так, это является причиной вашей проблемы, и вам нужно выяснить, что вызывает кэширование этих блоков. Штатная система Magento не будет кэшировать эти блоки, но это может быть вызвано сторонним расширением.

Наконец, после разрешения блочного кэша вам нужно будет подумать о кэшировании полного темпа (если оно используется). Здесь нет простых ответов, вам нужно либо не кэшировать затронутые страницы в FPC, либо найти способ поместить правильный ключ формы на страницу после ее обслуживания.

person Jim OHalloran    schedule 30.06.2014

Шаг за шагом, у меня была такая же проблема. Я начал регистрировать вывод сеансового ключа Mage::log(Mage::getSingleton('core/session')->getFormKey()); при каждой загрузке страницы.

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

Это привело меня к печенью. Я заметил, что после попытки войти в систему в качестве клиента в браузере были сохранены два файла cookie frontend: один с .my_domain.com, а другой только с my_domain.com, что привело к аннулированию.

Установка домена cookie с System -> Configuration -> General -> Web на my_domain.com решила проблему дублирования файлов cookie, и формы вели себя должным образом.

person Phil Birnie    schedule 21.06.2016