Zum Inhalt springen

Login-Prozess?

Erstellt am 1. Dezember 2007 · 7 Antworten · letzte Antwort am 30. August 2008

Tags: Frage

FGamba ·

Hallo,

wie kann ich in einer eigenen Extension einen
User einloggen?

Ich habe mir z._B. die Extension newloginbox schon genauer angesehen, finde aber dort
überhaupt keine Stelle, wo der Abgleich von Username/Passwort mit der Datenbank stattfinden würde (habe ich das übersehen oder findet das im Quelltext der Extension tatsächlich gar nicht statt?).

Gibt es vielleicht auch irgendwo ein Tutorial zur Sessionverwaltung in Typo3 und zur Validierung von Usern (insbesondere dazu, welche API-Funktionen bei der Extensionprogrammierung verwendet werden
sollten? Ich denke, da gibt es ja wohl Einiges zu beachten, ich habe aber noch keine
Doku. dazu gefunden.

Danke für Hilfe,
Ralf

just2b ·

das macht der auth service.

schau dir einfach mal die extensions an, die einen per IP automatisch einloggen, da wirst du den code finden

georg

FGamba ·

Danke Georg,

habe mir mal cc_iplogin_fe und cc_sv_auth angeschaut,
das scheint ja einigermaßen aufwändig zu sein, wenn
man das selbst umsetzen würde und dabei
alle Rechte und Konfigurationen berüchsichtigen will.

Vielleicht kann ich aber nochmal nachfragen zu
newloginbox:

wie bekommt denn newloginbox das hin,
wenn sie gar keinen code implementiert,
den user dann einzuloggen?
Wie ist denn das Standardverfahren zum Einloggen von
fe-usern?
Gibt es da keine einfache api-Funktion dafür
im Sinne t3div::checkAuth($username,$pwd)?

Enlightning Man ·

Ist zwar schon ein bisschen her, aber da ich grad dasselbe Problem hatte...

Abgleich Passwort mit Datenbank sollte ja trivial sein (steht in fe_users), mein Problem war, dass ich nicht gefunden habe wie der User denn dann wirklich eingeloggt wird. Hierzu jetzt aber mal die Lösung:

(Aufbauend auf dieser Quelle)

<?php
/**
 * Logs in a user in the Typo3 frontend by creating a valid session entry in fe_sessions.
 *
 * @param integer $userID
 * @return void
 */
public static function loginUser($userID) {
	$ip = array();
	$ip = explode('.',$_SERVER['REMOTE_ADDR']);

	$fields = array (
		'ses_id' => $_COOKIE['fe_typo_user'],
		'ses_name' => 'fe_typo_user',
		'ses_iplock' => $ip[0].'.'.$ip[1],
		'ses_hashlock' => intval(hexdec(substr(md5(':'.$_SERVER['HTTP_USER_AGENT']),0,7))),
		'ses_userid' => $userID,
		'ses_tstamp' => time(),
		'ses_data' => '',
		'ses_permanent' => 1
	);

	$GLOBALS['TYPO3_DB']->exec_INSERTquery('fe_sessions', $fields);
}
?>
Enlightning Man ·

Ah ok, interessanter code.

Es kommt halt ein bisschen drauf an, was man machen will. Das Ziel meiner Funktion war es nicht einen User zu verifizieren und einzuloggen, sondern ich wollte, dass er automatisch eingeloggt ist, sobald er sich registriert. Hab also den meinen MM Forum Registrierungs-Plugin durch eine XCLASS erweitert, und führe wenn die Mail verschickt wurde oben geposteten Code aus gefolgt von einer Weiterleitung auf eine Willkommensseite. Funktioniert wunderbar und ist ein bisschen weniger Code.

War alles in allem aber sehr überrascht, wie versteckt und aufwendig so eine Basis Funktion ist.

FGamba ·

Tatsächlich, das ist schon eine Zeit her.
Ich habe mal nachgeschaut, wie ich das
mit dem "auth-Service" dann eine Zeitlang
später gemacht hatte:

// hier kommt der ganze Code zum Login-Check hin
// dann, wenn Login o.k. ist der Standardweg
// anscheinend der über einen redirect,
// der dann den auth-Service beim Laden der Seite
// einbindet, ohne dass dafür überhaupt noch Code
// geschrieben werden muß:

    $url = 
  	'index.php?id='.$this->parent->conf['redirectPID']
  	. '&logintype="login"'
    . '&user='.$user . '&pass='.$pwd  . '&pid='.$id;   
    header ('Location: '.t3lib_div::locationHeaderUrl($url));  	
    die();

Das funktioniert, ist auch in der TSREF so dokumentiert,
und das Login funktioniert zudem genauso.
Was haltet Ihr davon?