das wird lang ...
Ich habe einen schlimmen Fall eines fehlerhaften Anmeldefehlers aufgrund einer falschen Cookie-Verwaltung. Zunächst verwalte ich ein geschlossenes Geschäft (B2B), in dem sich Kunden anmelden müssen, bevor sie den Katalog sehen können. Jeder nicht registrierte Zugriff wird auf die Anmeldeseite umgeleitet, aber hin und wieder kann sich der Kunde nicht anmelden, selbst wenn Benutzername und Passwort korrekt sind. Ich sage 'Benutzername', weil ich die Erweiterung Diglin_Username und das StoreRestricition-Plugin verwende, um das gewünschte Verhalten zu erzielen. Was passiert ist, dass ich manchmal zwei verschiedene Sätze von Cookies gefunden habe, die von Magento hinterlassen wurden, und die sich auf zwei verschiedene Domänen beziehen (z. B. www.abc.com und .abc.com).
Nachdem ich diesen Artikel des großen Alan Storm über die Instanziierung früher Sitzungen gelesen und das gefürchtete PHPSESSID-Cookie in meinem Browser gefunden hatte, untersuchte ich das Problem eingehend.
Was ich gefunden habe, ist zweiseitig. Zuerst habe ich einen Mage :: Log () -Aufruf in die Funktion start () in der Mage_Core_Model_Session_Abstract_Varien-Klasse eingefügt, um die verschiedenen Versuche von Magento zu protokollieren, eine neue Sitzung zu starten, und festgestellt, dass nach dem ersten Aufruf von Mage :: run () der preDispatch () Die Methoden dispatch () und postDispatch () der Klasse Mage_Core_Controller_Front_Action werden in der üblichen Reihenfolge aufgerufen. Wenn postDispatch () ausgeführt wird, kann die von preDispatch () gestartete Sitzung jedoch nicht gefunden werden, und es wird eine neue Sitzung erstellt. In dieser Hinsicht habe ich einen Unterschied im Code zwischen Magento 1.7.x und 1.8.x festgestellt, und ich denke, das könnte das Problem möglicherweise beheben:
Magento 1.7.x - Mage_Core_Model_Session_Abstract_Varien Klasse:
public function start($sessionName=null)
{
if (isset($_SESSION)) {
return $this;
}
.
.
}
Magento 1.8.x - Klasse Mage_Core_Model_Session_Abstract_Varien:
public function start($sessionName=null)
{
if (isset($_SESSION) && !$this->getSkipEmptySessionCheck()) {
return $this;
}
.
.
}
Ich kann jedoch nicht finden, wo die SkipEmptySessionCheck-Eigenschaft festgelegt werden soll, und habe am Ende die Mage_Core_Controller_Front_Action-Klasse auf folgende Weise gepatcht:
public function postDispatch()
{
parent::postDispatch();
if (!$this->getFlag('', self::FLAG_NO_START_SESSION )) {
if (session_id()) {
Mage::getSingleton('core/session')->setLastUrl(Mage::getUrl('*/*/*', array('_current'=>true)));
}
}
return $this;
}
postDispatch () ruft Mage :: getSingleton ('core / session') nicht auf (das hätte eine neue Sitzung erstellt), wenn keine bereits gestartete Sitzung gefunden werden kann. Bis zum PHPSESSID-Cookie und alles erledigt, dachte ich ...
Aber nicht so. Jetzt habe ich das PHPSESSID-Cookie entfernt, aber immer noch zwei verschiedene Cookies (unregelmäßig) im Browser gespeichert. Wenn ich nur die falschen Cookies lösche, kann ich mich erfolgreich anmelden, oder ich werde ohne Nachricht zur Anmeldeseite weitergeleitet. Ich habe versucht, die Cookie-Domäne explizit in der Systemkonfiguration anzugeben, aber das Problem wurde dadurch nicht behoben.
Wieder tief in der Codebasis, und ich fand heraus, dass an den verschiedenen Stellen, an denen Magento ein Cookie setzt, die Domäne von der Funktion getDomain () in der Klasse Mage_Core_Model_Cookie verwendet werden muss:
public function getDomain()
{
$domain = $this->getConfigDomain();
if (empty($domain)) {
$domain = $this->_getRequest()->getHttpHost();
}
return $domain;
}
Wenn Sie sich nun die Seite ansehen, die Sie von Magento in Ihrem Browser erhalten, finden Sie im Abschnitt "Kopf" Folgendes:
<script type="text/javascript">
//<![CDATA[
Mage.Cookies.path = '/';
Mage.Cookies.domain = '.www.abc.com';
//]]>
</script>
Diese Zeilen stammen aus app / design / frontend / base / default / template / page / js / cookie.phtml:
<script type="text/javascript">
//<![CDATA[
Mage.Cookies.path = '<?php echo $this->getPath()?>';
Mage.Cookies.domain = '<?php echo $this->getDomain()?>';
//]]>
</script>
und dieser Code verweist wiederum auf die Funktion getDomain () in der Klasse Mage_Page_Block_Js_Cookie:
public function getDomain()
{
$domain = $this->getCookie()->getDomain();
if (!empty($domain[0]) && ($domain[0] !== '.')) {
$domain = '.'.$domain;
}
return $domain;
}
Wenn ich also die Cookie-Domäne in der Systemkonfiguration auf beispielsweise "www.abc.com" setze, erhalte ich Folgendes:
Mage.Cookies.domain = '.www.abc.com'
und als ich in meinem Browser sowohl 'www.abc.com' als auch '.www.abc.com' Cookies fand, dachte ich: "Okay, ich setze '.abc.com' in der Systemkonfiguration und werde immer mit 'enden.' .abc.com 'Cookies !! "...
Aber auf keinen Fall. Jetzt bekomme ich auf meiner HTML-Seite immer '.abc.com', aber trotzdem habe ich unregelmäßig ein 'www.abc.com'-Cookie und kein Login.
Ich bin verwirrt und mein Kunde fängt an zu denken, dass ich nicht so gut bin, wie er dachte (ich fange auch an, das zu denken ...) :(
Haben einige von euch (und Mädels) einen Hinweis?
UPDATE: Ich habe jemanden gesehen, der Probleme mit Sitzungen und Cookies mit der Verwendung von Varnish als Cache für Magento in Verbindung gebracht hat. Da ich auch Varnish verwende, werde ich versuchen, das Problem zu beheben, wenn ich es deaktiviere.