Zum Inhalt springen

sr_feuser_register: Fehler bei der Benutzer-Authentifizierung

Erstellt am 29. Juli 2011 · 2 Antworten · letzte Antwort am 3. August 2011

Tags: Frontend-Benutzer, Datenbank, Frage

Unbekannter Benutzer ·

Hi,

ich muss die Extension sr_feuser_register anpassen und weiß nicht genau wo ich suchen soll. Es geht darum, dass Benutzer ihre Registration mit dem Link in der Confirmation-E-Mail authentifizieren müssen. Der Link ist jedoch defekt, es fehlen auch sonst alle Benutzerdaten in der E-Mail (z.B. Vor- und Nachname).

Die Serverumgebung ist folgende: es gibt einen Master-Server und mehrere Replikations-Server. Man erreicht die Webseite nur über die Replikations-Server. Bei schreibenden Datenbankzugriffen (wie z.B. das Anlegen eines neuen FE Users) werden die Daten an den Master-Server geschickt und dieser verteilt die geschrieben Daten an alle Replikations-Server. Bei lesendem Datenbankzugriff holt sicher jeder Replikations-Server die Daten aus der eigenen Datenbank.

Und ich vermute ganz stark, dass diese Aufgabenteilung dazu führt, dass die Registration nicht funktioniert. Ich weiß leider nicht genau wie die Extension arbeitet, aber es sieht danach aus, dass bei der Registration der neue FE User Datensatz in die DB geschrieben wird und gleich darauf folgend die Daten wieder aus der DB gelesen werden, um die E-Mail zusammenzubauen. Beim Lesen sind die Daten wegen dem oben beschriebenen Replikationsprozess jedoch noch nicht vorhanden und es kommt zum Fehler.

Wenn dem so ist, dann würde ich gerne versuchen mittels sleep(1); eine kleine Pause zwischen Schreiben und Lesen einzubauen, so dass der Replikationsprozess vollständig abgeschlossen ist, bevor die Extension versucht die Daten aus der DB zu lesen.

Kann mir einer sagen ob das wirklich so abläuft und wenn ja, wo ich in der Extension Anpassungen vornehmen muss?

Vielen Dank schon mal 🙂

Unbekannter Benutzer ·

Das Problem ist lokalisiert. Es liegt an der Replikation.

Im Script class_tx_srfeuserregister_data.php findet man in der Funktion save() folgende Zeile (sr_feuser_register Version 2.6.1):

<?php
$res = $this->cObj->DBgetInsert($theTable, $this->controlData->getPid(), $parsedArray, $newFieldList, TRUE);
$newId = $TYPO3_DB->sql_insert_id();
?>

Das Problem bei einer Master-Slave Konfiguration, wo DB-schreibende Anweisungen nur auf dem Master ausgeführt werden und DB-lesende Anweisungen auf dem jeweiligen Slave ausgeführt werden ist, dass der Befehl sql_insert_id() keine ID zurückliefert (also den Wert 0). Daher kann der Datensatz im weiteren Verlauf des Scripts nicht identifiziert werden und es kommt zu dem von mir beschriebenen Fehler.

Hoffe das hilft euch, wenn noch jemand vor so einem Problem steht!

Eine Lösung wäre, den jeweiligen Datensatz nicht über die ID sondern über andere Kriterien eindeutig zu identifzieren und die UID nachträglich auszulesen. Dafür hab ich aber noch keine richtig Lösung.

Unbekannter Benutzer ·

Folgendes hat mich nun zur Lösung des Problem geführt: Wie schon beschrieben muss ich den neuen Datensatz eindeutig identifizieren um daraus die passende UID auszulesen:

Die ersten beiden Zeilen sowie die letzte Zeile sind original aus der Extension (model/class.tx_srfeuserregister_data.php), das dazwischen hab ich hinzugefügt:

<?php

$res = $this->cObj->DBgetInsert($theTable, $this->controlData->getPid(), $parsedArray, $newFieldList, TRUE);
$newId = $TYPO3_DB->sql_insert_id();
					
/**
 * -------------------------------------------------------------------------
 * zusätzliche Überprüfung und Auslesen der neuen UID
 * nötig wegen Replikationsproblem
 */
if($newId <= 0) {
	sleep(1);
	$tmpwhere  = 'email='.$TYPO3_DB->fullQuoteStr($parsedArray['email'], $theTable);
	$tmpwhere .= ' AND first_name='.$TYPO3_DB->fullQuoteStr($parsedArray['first_name'], $theTable);
	$tmpwhere .= ' AND last_name='.$TYPO3_DB->fullQuoteStr($parsedArray['last_name'], $theTable);
	$tmpwhere .= ' AND name='.$TYPO3_DB->fullQuoteStr($parsedArray['name'], $theTable);
	$tmpwhere .= ' AND password='.$TYPO3_DB->fullQuoteStr($parsedArray['password'], $theTable);
	$tmpwhere .= ' AND disable=1';
	$tmpwhere .= ' AND usergroup='.$TYPO3_DB->fullQuoteStr($parsedArray['usergroup'], $theTable);
	$tmpwhere .= ' AND gender='.$TYPO3_DB->fullQuoteStr($parsedArray['gender'], $theTable);	
	
	$tmpArr = $TYPO3_DB->exec_SELECTgetRows('uid', $theTable, $tmpwhere, '', '', '1');
	$newId = intval($tmpArr[0]['uid']);
}

/**
 * -------------------------------------------------------------------------
 */
					
$rc = $newId;
			
?>

Ich benutze so gut wie jeden Wert, der vom Benutzer ins Registrierungsformular im Frontend eingegeben hat und suche damit nach dem passenden Datensatz in der Datenbank. Die gefundene UID wird an $newId übergeben und die Extension kann wie gewohnt weitermachen.