Da ich schon oft gehört habe, dass einige User das gleiche suchen, jedoch nie so richtig darauf eingegangen wurde will ich mal versuchen meinen Lösungsweg zu posten:
Wir betreiben auch ein selbstprogrammiertes Portal mit eigener Userverwaltung. Selbstverständlich haben wir das PHPBB als Board im Einsatz und das schon seit mehr als 3 Jahren.
Um die Benutzung der Seite so einfach wie möglich zu machen, ist es zwingend notwendig, dass die User sich nicht zweimal getrennt einloggen müssen. Das wäre unzumutbar.
Bis zu unserem Relaunch vor einer Woche hatten wir die mit einer manipulierten login.php des phpbb gelöst, was jedoch den Nachteil hatte, dass Updates des PHPBB immer ein Akt waren, da die Änderungen jedesmal durchgeführt werden mussten.
Ich suchte nach einer Lösung, die das eleganter und mit weniger Aufwand erledigt und stieß beim googlen auf eine Klasse, die das ganze erledigen soll. Die Klasse heißt PHPBB_LOGIN class und ist über
http://www.phpclasses.org/browse/package/1532.html zu beziehen.
Die Klasse kann einfach eingebunden werden und erwartet als Parameter die UserID des einzuloggenden Forums-Users.
Ich habe mir die Klasse dann so umgestrickt, dass ich anstatt der UserID den Usernamen übergebe und dass die Klasse sich darum kümmert die dazugehörige UserID rauszufinden.
Das hat dann auch auf Anhieb super funktioniert, jedoch hatte ich bis heute Probleme mit dem Autologin. Ich konnte das vorerst nur durch eine Manipulation an der phpBB2/includes/sessions.php beheben, was aber auch noch nicht das gelbe vom Ei ist.
Meine modifizierte phpbblogin.php sieht jetzt so aus:
Code: Alles auswählen
<?php
/*
* PHPBB_Login allows you to integrate your own login system
* with phpBB. Meaning that you can have one login valid across
* both your website and phpBB.
*
* To take full advantage of this PHPBB_Login class you just
* need to modify your own login system to include a call
* to the relevant methods in here.
*
* This system is reliant on the website username being exactly
* the same as the phpBB username. To insure this, I recommend
* disabling the ability to change usernames from within the
* phpBB admin control panel.
*
* Distributed under the LGPL license:
* http://www.gnu.org/licenses/lgpl.html
*
* Duncan Gough
* 3rdSense.com
*
* Home http://www.suttree.com
* Work http://www.3rdsense.com
* Play! http://www.playaholics.com
*/
class PHPBB_Login
{
function PHPBB_Login()
{
}
function login($phpbb_user_name)
{
global $db, $board_config;
global $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $SID;
// Setup the phpbb environment and then
// run through the phpbb login process
// You may need to change the following line to reflect
// your phpBB installation.
// ersetze FORUM_ROOT durch den absoluten Pfad zu deinem Forum
require_once(FORUM_ROOT . "/config.php" );
define("IN_PHPBB",true);
// You may need to change the following line to reflect
// your phpBB installation.
$phpbb_root_path = FORUM_ROOT;
require_once($phpbb_root_path . "extension.inc");
require_once($phpbb_root_path . "common.php");
/*** modifiziert, um die userID zum Usernamen rauszufinden ***/
$sql = "SELECT *";
$sql .= " FROM " . $table_prefix . "users u";
$sql .= " WHERE username = '" . $phpbb_user_name . "'";
$phpbb_user_id = @mysql_result(@mysql_query($sql),0,"user_id");
/************/
return session_begin($phpbb_user_id,$user_ip,PAGE_INDEX,FALSE,TRUE);
}
function logout($session_id,$phpbb_user_name)
{
global $db, $lang, $board_config;
global $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $SID;
// Setup the phpbb environment and then
// run through the phpbb login process
// You may need to change the following line to reflect
// your phpBB installation.
require_once(FORUM_ROOT . "/config.php" );
define("IN_PHPBB",true);
// You may need to change the following line to reflect
// your phpBB installation.
$phpbb_root_path = FORUM_ROOT;
require_once($phpbb_root_path . "extension.inc");
require_once($phpbb_root_path . "common.php");
/*** modifiziert ***/
$sql = "SELECT *";
$sql .= " FROM " . $table_prefix . "users u";
$sql .= " WHERE username = '" . $phpbb_user_name . "'";
$phpbb_user_id = mysql_result(@mysql_query($sql),0,"user_id");
/************/
session_end($session_id,$phpbb_user_id);
// session_end doesn't seem to get rid of these cookies,
// so we'll do it here just in to make certain.
setcookie($board_config[ "cookie_name" ] . "_sid", "",time() - 3600," ");
setcookie($board_config[ "cookie_name" ] . "_mysql", "",time() - 3600," ");
}
}
?>
Zu beachten ist, dass ich bevor ich die Klasse eingebunden habe, schon eine Datenbankverbindung hergestellt habe, denn die muss ja wärend des
Funktionsaufrufs schon bestehen.
Um die Klasse jetzt zu benutzen, fügt ihr in eurem Skript an der der User eingeloggt wird diesen Code ein:
Code: Alles auswählen
// PHPBB-Loginklasse instanziieren
$phpBB = new PHPBB_Login();
// im Forum einloggen
$session_id = $phpBB->login($login_username);
Beim Ausloggen ist es fast ähnlich:
Code: Alles auswählen
$phpBB = new PHPBB_Login();
$phpBB->logout(session_id(),@mysql_result($query,0,"username"));
Ich hoffe euch damit eine grobe Anleitung gegeben zu haben wie man den Login von einem externen eigenen Portal mit dem PhpBB Login zusammenlegen kann,
so dass der User sich nur ein einziges Mal einloggen braucht. Wie man sieht, kann man hier weiterhin sein eigenes Loginsystem benutzen.
Das ganze hat garantiert auch Nachteile, von daher freu ich mich auf Feedback und vielleicht hat ja der ein oder andere noch Ideen wie man das optimieren kann. Wie gesagt, hat der Autologin jedoch erst funktioniert , nach dem ich ihn in der sessions.php erzwungen habe. Mal schaun wie ich das am besten löse.
Christoph