phpBB Usersystem in eigener Seite nutzen
-
Hi,
wie der Titel schon sagt, will ich das Usersystem des phpBB-Boards für meine Seite nutzen. Das heißt ich habe ein paar zusätzliche Felder in die DB eingefügt, um für jeden Benutzer auch ein paar extra Sachen speichern zu können. Wenn der User meine Seite betritt, also nicht das Forum, sollen dann ebenfalls der Autologin funktionieren und der Benutzer soll ich auch direkt auf der Seite einloggen können und das Forum nur als ein "Teil" der Seite fungieren. Problem ist jetzt nur, dass das Sessionmanagment vom phpBB recht kompliziert ist, ich habe auch schon den Code ein wenig studiert und bekomme es einfach nicht hin die ganze Sache zum Laufen zu bekommen. Weiß jemand wie sich eine entsprechende Lösung einrichten lässt oder kann mir jemand den Aufbau ein wenig näher bringen. Entsprechende Links würden helfen, danke schon im Vorraus.
-
hehe
ich hab das selbe prob *gg*
bin mal gespannt was rauskommtcya
-
wie denn? hat keiner ne ahnung?
dann muss ich mich ja doch selber hinsetzen *kotz*cya
-
Hm, also Hife wäre wirklich sehr schön, ich bekomm das nicht wirklich hin. Ich weiß erstmal nur, dass im Auth-Cookie die letzte SessionID gespeichert ist und beim starten des Forum diese ausgelesen wird und der User eine neue Session zugewiesen bekommt mit seinen Benutzerdaten drin, mit der er dann durchs Forum surft. Wie das genau abläuft weiß ich auch noch nicht, der Code vom phpBB ist so schrecklich modular, für die Lösung müsste man mindestens 4 - 5 extrem große Dateien durchackern. Hilfe wäre wirklich sehr willkommen
-
schau mal auf www.phpbb.de
sehr gutes Hilfe-Forum für phpBB
-
Hab ich natürlich schon gemacht, bin jetzt dem Problem etwas näher gekommen. Also phpBB identifiziert den Benutzer auf jeder Seite neu, entweder über SessionID oder Cookies. Einfach in der Session.php nachschauen. Der Code ist etwas unübersichtlich, aber ich habe es schon fast gelöst
-
benutze doch einfach den code
<? define('IN_PHPBB', true); $phpbb_root_path = './'; include($phpbb_root_path . 'extension.inc'); include($phpbb_root_path . 'common.'.$phpEx); $userdata = session_pagestart($user_ip, PAGE_INDEX); init_userprefs($userdata); if ( $userdata['user_id'] != -1 ) echo($userdata['username']); ?>
-
Michamba, wenn du es gelöst hast, sag bescheid ok?
soweit war ich auch schon *gg*
aber ich war scheinbar zu blöd *lol*cya
-
Ne, leider ist das nicht so simpel wie von Dimah dargestellt, phpBB vollzieht in diesen Dateien leider ein paar Schritte, die ich nicht auf meiner Seite haben will, mitunter gibt es auch schon ausgaben und dann diese ganze Sache mit dem Bannen, das soll alles nicht mit der Seite zu tun haben, ich will bloß die reinen Benutzerdaten haben. Ich habe schon fast eine fertige Lösung, aber leider funzt es noch nicht richtig, hier mal der Code, vielleicht fallen ja jemanden Fehler auf (hab aber keinen Bock das alles zu extrahieren, also so wie auf meiner Seite hier):
<? // Datei: include/config.inc.php // Enthält Konfigurationsdaten für meine Seite und phpBB $host = "xxx"; $name = "xxx"; $passwort = "xxx"; ... $phpbb_database = "forum"; $phpbb_prefix = "phpbb_"; ?>
<? // Datei: include/functions.inc.php // Enthält alle wichtigen Funktionen function get_ip() { // Holt sich die IP des Users if( getenv('HTTP_X_FORWARDED_FOR') != '' ) { $client_ip = ( !empty($HTTP_SERVER_VARS['REMOTE_ADDR']) ) ? $HTTP_SERVER_VARS['REMOTE_ADDR'] : ( ( !empty($HTTP_ENV_VARS['REMOTE_ADDR']) ) ? $HTTP_ENV_VARS['REMOTE_ADDR'] : $REMOTE_ADDR ); $entries = explode(',', getenv('HTTP_X_FORWARDED_FOR')); reset($entries); while (list(, $entry) = each($entries)) { $entry = trim($entry); if ( preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $entry, $ip_list) ) { $private_ip = array('/^0\./', '/^127\.0\.0\.1/', '/^192\.168\..*/', '/^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..*/', '/^10\..*/', '/^224\..*/', '/^240\..*/'); $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]); if ($client_ip != $found_ip) { $client_ip = $found_ip; break; } } } } else { $client_ip = ( !empty($HTTP_SERVER_VARS['REMOTE_ADDR']) ) ? $HTTP_SERVER_VARS['REMOTE_ADDR'] : ( ( !empty($HTTP_ENV_VARS['REMOTE_ADDR']) ) ? $HTTP_ENV_VARS['REMOTE_ADDR'] : $REMOTE_ADDR ); } $ip_sep = explode('.', $client_ip); return sprintf('%02x%02x%02x%02x', $ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]); } function db_conn($db = "sw") { // Stellt eine Datenbankverbindung her, je nach Parameter global $host, $name, $passwort, $phpbb_database, ...; if($db == "sw") { // Verbindung mit der Datenbank meiner Seite } else if($db == "phpbb") { if(!$link = mysql_connect($host, $name, $passwort)) { message("Keine Datenbankverbindung möglich !","red"); } if(!mysql_select_db($phpbb_database)) { message("Auswahl der Datenbank fehlgeschlagen !","red"); } } else { message("Parameter fü Datenbankauswahl ist fehlerhaft !","red"); } } function get_phpbb_config() { global $phpbb_prefix; $board_config = array(); db_conn("phpbb"); $result = mysql_query("SELECT * FROM " . $phpbb_prefix . "config"); if(!$result) { message("Konnte Konfigurationsdaten von phpBB nicht laden","red"); } while ($row = mysql_fetch_array($result)) { $board_config[$row['config_name']] = $row['config_value']; } return $board_config; } function session_init($user_id, $user_ip, $page_id, $auto_create = 0, $enable_autologin = 0) { global $phpbb_prefix, $cookiename, $cookiepath, $cookiedomain, $cookiesecure, $HTTP_COOKIE_VARS; if(isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) || isset($HTTP_COOKIE_VARS[$cookiename . '_data']) ) { $session_id = isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) ? $HTTP_COOKIE_VARS[$cookiename . '_sid'] : ''; $sessiondata = isset($HTTP_COOKIE_VARS[$cookiename . '_data']) ? unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data'])) : array(); $sessionmethod = SESSION_METHOD_COOKIE; } else { $sessiondata = array(); $session_id = ( isset($HTTP_GET_VARS['sid']) ) ? $HTTP_GET_VARS['sid'] : ''; $sessionmethod = SESSION_METHOD_GET; } $current_time = time(); $expiry_time = $current_time - $board_config['session_length']; $result = mysql_query("SELECT * FROM " . $phpbb_prefix . "users WHERE user_id = '" . $user_id . "'"); if(!$result) { message("Konnte keine Verbindung zur Benutzerdatenbank herstellen","red"); } $userdata = mysql_fetch_array($result); if ($user_id != ANONYMOUS) { $auto_login_key = $userdata['user_password']; if($auto_create) { if(isset($sessiondata['autologinid']) && $userdata['user_active'] ) { // Automatischer Login if($sessiondata['autologinid'] == $auto_login_key) { // Auto-LoginID matches password $login = 1; $enable_autologin = 1; } else { // No match; don't login, set as anonymous user $login = 0; $enable_autologin = 0; $user_id = $userdata['user_id'] = ANONYMOUS; } } else { // AutoLogin ist nicht gesetzt. Kein Login, als ANONYMOUS setzten $login = 0; $enable_autologin = 0; $user_id = $userdata['user_id'] = ANONYMOUS; } } else { $login = 1; } } else { $login = 0; $enable_autologin = 0; } $query = "UPDATE " . $phpbb_prefix . "sessions SET session_user_id = '" . $user_id . "', session_start = $current_time, session_time = $current_time, session_page = $page_id, session_logged_in = $login WHERE session_id = '" . $session_id . "' AND session_ip = '$user_ip'"; if(!mysql_query($query) || !mysql_affected_rows()) { $session_id = md5(uniqid($user_ip)); $result = mysql_query("INSERT INTO " . $phpbb_prefix . "sessions (session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in) VALUES ('$session_id', '$user_id', $current_time, $current_time, '$user_ip', $page_id, $login)"); if(!$result) { message("Fehler beim Anlegen der Session - " . mysql_errno() . ": " . mysql_error() . "\n","red"); } } if ($user_id != ANONYMOUS ) { $sessiondata['autologinid'] = ($enable_autologin && $sessionmethod == SESSION_METHOD_COOKIE) ? $auto_login_key : ''; $sessiondata['userid'] = $user_id; } $userdata['session_id'] = $session_id; $userdata['session_ip'] = $user_ip; $userdata['session_user_id'] = $user_id; $userdata['session_logged_in'] = $login; $userdata['session_page'] = $page_id; $userdata['session_start'] = $current_time; $userdata['session_time'] = $current_time; setcookie($cookiename . '_data', serialize($sessiondata), $current_time + 31536000, $cookiepath, $cookiedomain, $cookiesecure); setcookie($cookiename . '_sid', $session_id, 0, $cookiepath, $cookiedomain, $cookiesecure); $SID = 'sid=' . $session_id; return $userdata; } function message(...) { // Ausgabe von Nachrichten und Fehlermeldungen } ?>
-
<? // Datei: include/common.inc.php // Identifiziert den Benutzer und macht einige andere Sachen // Hier erstmal ein paar Sachen für meine Seiten, z.B. checken ob der // Installationsordner noch besteht usw. ... $board_config = get_phpbb_config(); $userdata = array(); $user_ip = get_ip(); $cookiename = $board_config['cookie_name']; $cookiepath = $board_config['cookie_path']; $cookiedomain = $board_config['cookie_domain']; $cookiesecure = $board_config['cookie_secure']; $current_time = time(); unset($userdata); if (isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) || isset($HTTP_COOKIE_VARS[$cookiename . '_data']) ) { $sessiondata = isset($HTTP_COOKIE_VARS[$cookiename . '_data']) ? unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data'])) : array(); $session_id = isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) ? $HTTP_COOKIE_VARS[$cookiename . '_sid'] : ''; $sessionmethod = SESSION_METHOD_COOKIE; } else { $sessiondata = array(); $session_id = (isset($HTTP_GET_VARS['sid'])) ? $HTTP_GET_VARS['sid'] : ''; $sessionmethod = SESSION_METHOD_GET; } if(!empty($session_id)) { // Session existiert, Benutzerdaten holen $result = mysql_query("SELECT u.*, s.* FROM " . $phpbb_prefix . "sessions s, " . $phpbb_prefix . "users u WHERE s.session_id = '$session_id' AND u.user_id = s.session_user_id"); if(!$result) { message("Konnte Benutzerdaten nicht aus der Datenbank holen","red"); } $userdata = mysql_fetch_array($result); if(isset($userdata['user_id'])) { $ip_check_s = substr($userdata['session_ip'], 0, 6); $ip_check_u = substr($user_ip, 0, 6); if ($ip_check_s == $ip_check_u) { $SID = ($sessionmethod == SESSION_METHOD_GET) ? 'sid=' . $session_id : ''; if ( $current_time - $userdata['session_time'] > 60 ) { $result = mysql_query("UPDATE " . $phpbb_prefix . "sessions SET session_time = $current_time, session_page = 0 WHERE session_id = '" . $userdata['session_id'] . "'"); if(!$result) { message("Fehler beim updaten der Session-Tabelle","red"); } if ($userdata['user_id'] != ANONYMOUS ) { $result = mysql_query("UPDATE " . $phpbb_prefix . "users SET user_session_time = $current_time, user_session_page = 0 WHERE user_id = " . $userdata['user_id']); if(!$result) { message("Fehler beim updaten der Session-Tabelle","red"); } } $expiry_time = $current_time - $board_config['session_length']; $result = mysql_query("DELETE FROM " . $phpbb_prefix . "sessions WHERE session_time < $expiry_time AND session_id <> '$session_id'"); if(!$result) { message("Fehler beim Löschen in der Session-Tabelle","red"); } setcookie($cookiename . '_data', serialize($sessiondata), $current_time + 31536000, $cookiepath, $cookiedomain, $cookiesecure); setcookie($cookiename . '_sid', $session_id, 0, $cookiepath, $cookiedomain, $cookiesecure); } } } } $user_id = (isset($sessiondata['userid']) ) ? intval($sessiondata['userid']) : ANONYMOUS; if(!($userdata = session_init($user_id, $user_ip, 0, TRUE)) ) { message("Fehler beim Anlegen der Session","red"); } // $userdata nun verhanden // User identifiziert if($userdata["session_logged_in"]) { echo($userdata["username"]); } ... ?>
Eingebunden wird das ganze dann so, hier z.B. eine Beispielseite:
<? ... include("include/config.inc.php"); include("include/functions.inc.php"); include("include/common.inc.php"); // Ausgabe des Contents ... ?>
-
Inwiefern funktioniert es denn nicht wie gewünscht?
-
Also im Forum bin ich angemeldet wie gewünscht mit Auologin, hier die Ausgabe von Userdata:
0: 2
user_id: 2
1: 1
user_active: 1
2: mab
username: mab
3: 4dfe6a0876758f70e6279f8d8c2efcde
user_password: 4dfe6a0876758f70e6279f8d8c2efcde
4: 1066043389
user_session_time: 1066043389
5: 0
user_session_page: 0
6: 1066042997
user_lastvisit: 1066043389
7: 1066042969
user_regdate: 1066042969
8: 1
user_level: 1
9: 1Wenn ich nun in der Seite mir Userdata ausgeben lasse kommt folgendes:
0: 2
user_id: ANONYMOUS
1: 1
user_active: 1
2: mab
username: mab
3: 4dfe6a0876758f70e6279f8d8c2efcde
user_password: 4dfe6a0876758f70e6279f8d8c2efcde
4: 1066044649
user_session_time: 1066044649
5: 0
user_session_page: 0
6: 1066044638
user_lastvisit: 1066044638
7: 1066042969
user_regdate: 1066042969
8: 1
user_level: 1
9: 1
...
session_id: 4af2da35be34dc9013c30d8a57275aba
session_ip: 00000000
session_user_id: ANONYMOUS
session_logged_in: 0
session_page: 0
session_start: 1066044655
session_time: 1066044655Keine Ahnung warum das so ist, sehe das Problem einfach nicht, aber der Fehler muß wohl daran liegen, dass er $sessiondata['autologinid']) in der Seite nicht hat. Aber keine Ahnung waran das liegt
-
Was steht denn in $cookiedomain bzw. $board_config['cookie_domain']´? Evtl. ist das Cookie nämlich im Stammordner einfach nur nicht mehr gültig
-
Hm, Cookiepath hat einfach nur den Wer "/". Auf meinem Server ist das Forum in einem Unterverzichnis namens ./forum/. Aber ich habe mir gerade die Cookievariablen nochmal ausgeben lassen und folgendes bekommen:
SessionID: 64855d3ff2677c168f841239b7b5ec45
Sessiondata: autologinid: 4dfe6a0876758f70e6279f8d8c2efcde
Sessiondata: userid: 2Also sieht erstmal richtig aus, doch wenn ich dann den Code weiterlaufen lasse bin ich trotzdem als ANONYMOUS gesetzt
Langsam verlier ich hier meinen Verstand
-
Also ich hab mir nochmal den Code genau angesehen und der Fehler liegt irgendwo in der Funktion session_init(). Dort habe ich vergessen die Variablen $cookiename usw. als global zu deklarieren, aber das hilft auch nicht weiter. Folgende Zeile wird als FALSE zurückgegeben, obwohl $cookiename usw gegeben sind und die Cookies in der common.inc.php korrekt identifiziert werden:
if (isset(HTTP\_COOKIE\_VARS[cookiename . '_sid']) || isset(HTTP\_COOKIE\_VARS[cookiename . '_data']) )
-
Ich habe mal ein paar Statusausgaben eingefügt und das Ergebnis ist eindeutig:
Common: Session_id aus Cookies: 5302caefb7961ac63985e3114ddd8947
Common: Userdata aus der Datenbank anhand der Cookies: 2
Common: IP-Check: 7f0000 == 000000 ???
Common: Session_init wird aufgerufen mit $user_id = 2Session_init: Start der Funktion session_init()
Session_init: $cookiename ist gegeben: phpbb2mysql
Session_init: Cookies nicht vorhanden und Veriablen sind leer
Session_init: Session_ID folglich aus Cookies:
Session_init: User_id ist nicht ANONYMOUS, da korrekt aus Common übergeben: 2
Session_init: $auto_create = 1
Session_init: Sessiondata[autologinid] nicht vorhanden oder Account nicht aktiviert - User_id wird ANONYMOUS gesetzt
Session_init: Neue Session soll angelegt werden für folgende User_id: ANONYMOUSWarning: Cannot add header information - headers already sent by (output started at d:\homepage\aktuell\ski-world\include\common.inc.php:33) in d:\homepage\aktuell\ski-world\include\functions.inc.php on line 191
Warning: Cannot add header information - headers already sent by (output started at d:\homepage\aktuell\ski-world\include\common.inc.php:33) in d:\homepage\aktuell\ski-world\include\functions.inc.php on line 192
Session_init: Cookies werden gesetzt (phpbb2mysql_data und phpbb2mysql_sid) mit $sessiondata und $session_id
Session_init: $userdata wird zurückgegeben an common.inc.php
Common: Session_init wurde aufgerufen und Userdata sollte nun vorhanden sein:0: 2
user_id: ANONYMOUS
1: 1
user_active: 1
2: mab
username: mab
3: 4dfe6a0876758f70e6279f8d8c2efcde
user_password: 4dfe6a0876758f70e6279f8d8c2efcde
4: 1066051051Irgendwie kann er die Cookies in der Session_init nicht mehr lesen, keine Ahnung warum, hat jemand ne Ahnung, ich sehe absolut keinen Fehler
-
global $HTTP_COOKIE_VARS;
$HTTP_COOKIE_VARS ist nämlich im Gegensatz zu $_COOKIE (ab PHP >= 4.1.0 vorhanden) nicht autoglobal
-
Juhhhhhhhhhuuuuuu
Es funktioniert, danke flenders mein Retter. Und der ganze Rummel nur wegen soner Kleinigkeit@MrChat: Ich habe jetzt übrigens den Code hier im Thread so editiert, dass er funktioniert
-
thx thx
ich werd es mal testen *gg*
cya
-
hmm also ich schlag mich grade damit rum, weil ich es jetz eigentlich für die site auch gebrauchen könnte
leider raff ich das ganz und gar net...
also einloggen tu ich mich per dieser login.php von phpBB..
d.h. ich übergene dieser Datei die parameter username und password..allerdings soll er mich jetz nit direkt auf die phpbb - seite umleiten sondern wieder auf die hauptseite..
und dann muss ich ja die userdaten auslesen können..
mehr will ich ja nichtaber ich bin scheinbar zu blöd dazu *heul*
cya
-
Also ich habe mir eigentlich alles selber geschrieben, bringt ein paar Vorteile, so verzichte ich auf viel unnützen Code den ich auf der Seite im Gegensatz zum Forum sowieso nicht brauche. Aber der Login ist ja garnicht mal so das Thema, den kann man immer noch machen, wichtig ist das du in jeder Seite deiner HP den User erst identifizierst, ich habe dafür 3 Dateien gewählt wie gesagt, eine Datei mit den wichtigen Variablen (phpBB-Prefix, Datenbankverbindungen, usw.), eine Datei in der alle wichtigen Funktionen enthalten sind (also z.B. Konfigurationsdaten des Forum auslesen) und dann noch die Common.inc.php in der der Benutzer identifiziert wird. Alle 3 Dateien werden in jede Seite eingebunden. Im Grunde genommen brauchst du dir bloß meinen Code ein wenig umschreiben und in dir zurechtlegen, man kann das alles auch in einer Datei erledigen. Falls du konkrete Hilfe brauchst sag es, bei mir funktioniert jetzt alles perfekt