phpBB3 mit einem CMS verbinden

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
kidata
Mitglied
Beiträge: 4
Registriert: 09.09.2008 19:21

phpBB3 mit einem CMS verbinden

Beitrag von kidata »

Ich möchte phpBB mit einer bestehenden Site (CMS-basiert) verbinden, konkret möchte ich auf User- & Gruppen-Informationen zurückgreifen.

phpBB stellt dabei den neuen Community-Bestandteil der Website, Foren, Downloads, Userprofile etc. zur Verfügung. Im Website-Frontend soll aber auch ein Login in die Community und bei angemeldeten Usern auch die Userinfos vorhanden sein.

Das ganze läuft auf dem gleichen Server und innerhalb der gleichen DB. Ich hab jetzt also testweise mal vom CMS aus (über ein Template) den cookie_name ermittelt und kann dann über die Tabelle phpbb_sessions ja rausfinden, ob der User angemeldet ist (und anschließend Userinfos abrufen)
Das funktioniert natürlich nur mit aktiven Cookies, aber das ist völlig OK.

So ganz optimal finde ich das natürlich noch nicht, am liebsten würde ich direkt die commons.php ins CMS-Template includen, phpBB alles weitere erledigen lassen und dann auf das user()-Objekt zugreifen, aber das ist mir leider nicht so recht gelungen, da phpBB in einem Unterordner liegt, um Kollisionen mit der index.php des CMS zu vermeiden, und der include aus einer Klasse des CMS erfolgt ... auch eine Erweiterung des include_path mit dem phpBB-Verzeichnis zur Laufzeit mit set_include_path() hat es nicht gebracht ...

Nun ja, lange Rede kurzer Sinn:
Ist es sicherheitsbedenklich, den angemeldeten User rein übers Cookie zu bestimmen (das Cookie könnte man ja modifizieren, bräuchte dann aber immer noch eine passende session_id für phpbb_sessions.session_id um die Session eines anderen Users zu ergattern)
Oder hat jemand vielleicht schon eine Lösung wie man phpBB in/an ein CMS integriert/anbindet?
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Hauptproblem das ich daran sehe ist: Was machst du wenn der User Cookies deaktiviert hat? phpBB ist in der Lage dann per URL Änderung (SID anhängen) dennoch den Loginstatus zu behalten, auf deiner Seite wäre der User aber sofort völlig ausgeloggt. Das lässt sich aber wohl sowieso nur verhindern wenn du in deinem CMS sämtliche Links durch die Funktion append_sid() von phpBB jagst.

Je nach dem was du für ein CMS benutzt gibt es evtl. sogar eine Brücke (Joomla z.B., evtl. noch andere von denen ich nichts weiß).

Das Problem was sich auch ergeben könnte wenn du versuchst die normale common.php einzubinden ist, dass sich vermutlich Kollisionen mit den Klassennamen ergeben (bei mir wäre das zumindest so, hängt natürlich vom aufbau des CMS ab). Wenn das kein Problem ist solltest du durch setzen von $phpbb_root_path auf den Unterordner und durch definieren von IN_PHPBB als true vor dem Aufruf die common.php einbinden können und den rest erledigen lassen. Vorraussetzung hier ist aber, dass vorher noch keine Ausgabe erfolgte (sonst kann man ja auch keine Cookies mehr setzen). Wenn das ein Problem ist, dann müsstest du dir selbst einen Ersatz für die common.php erstellen (vielleicht ist es teilweise möglich, die Konfliktobjekte zu "mergen", z.B. wenn die Methodennamen sich nicht überschneiden).

Ist aber alles aufwändig. Wenn du auf User ohne Cookies verzichten kannst, dann identifiziere anhand des Cookies. Letztlich macht phpBB das ja auch. Wenn du dir die entsprechende Sektion im Code genauer ansiehst kannst du evtl. Teile davon übernehmen.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
atrox
Mitglied
Beiträge: 242
Registriert: 08.08.2007 00:48
Wohnort: Ravensburg

Beitrag von atrox »

Du kannst bei http://www.ubuntuusers.de nachfragen, die haben das gemacht (+Wiki) und dem System sogar einen Namen gegeben.

Gruß atrox
Benutzeravatar
kidata
Mitglied
Beiträge: 4
Registriert: 09.09.2008 19:21

Beitrag von kidata »

Hallo gn#36,

danke für deine umfangreiche Antwort! Hat leider etwas gedauert mit meiner Rückantwort ...
gn#36 hat geschrieben:Hauptproblem das ich daran sehe ist: Was machst du wenn der User Cookies deaktiviert hat? phpBB ist in der Lage dann per URL Änderung (SID anhängen) dennoch den Loginstatus zu behalten, auf deiner Seite wäre der User aber sofort völlig ausgeloggt. Das lässt sich aber wohl sowieso nur verhindern wenn du in deinem CMS sämtliche Links durch die Funktion append_sid() von phpBB jagst.
Cookies als Vorraussetzung zur Benutzung ist von unserer Seite aus erstmal vertretbar. Und zur Not können wir auch noch mit den Output-Filtern des CMS das append_sid() über die Seiten jagen um die Session nicht zu verlieren.
gn#36 hat geschrieben:Je nach dem was du für ein CMS benutzt gibt es evtl. sogar eine Brücke (Joomla z.B., evtl. noch andere von denen ich nichts weiß).
Konkret geht es dabei um REDAXO und es soll nicht das komplette phpBB eingebunden werden, sondern nur ein Login aus einer CMS-Seite ins Forum möglich sein (kein Problem soweit, ist schon realisiert) nach dem Login sollen dann nur ein paar Profil-Infos (PN-Status etc) in den CMS-Seiten verfügbar sein. Da wäre es natürlich schön mit den phpBB-eigenen Klassen zu arbeiten.
gn#36 hat geschrieben:Das Problem was sich auch ergeben könnte wenn du versuchst die normale common.php einzubinden ist, dass sich vermutlich Kollisionen mit den Klassennamen ergeben (bei mir wäre das zumindest so, hängt natürlich vom aufbau des CMS ab). Wenn das kein Problem ist solltest du durch setzen von $phpbb_root_path auf den Unterordner und durch definieren von IN_PHPBB als true vor dem Aufruf die common.php einbinden können und den rest erledigen lassen. Vorraussetzung hier ist aber, dass vorher noch keine Ausgabe erfolgte (sonst kann man ja auch keine Cookies mehr setzen). Wenn das ein Problem ist, dann müsstest du dir selbst einen Ersatz für die common.php erstellen (vielleicht ist es teilweise möglich, die Konfliktobjekte zu "mergen", z.B. wenn die Methodennamen sich nicht überschneiden).
Hm, das setzen der benötigten Variablen und Konstanten im Template sowie das Includen der common.php funktioniert schon mal, nur wird dabei irgendwie das $db-Objekt nicht initialisiert:

Code: Alles auswählen

Fatal error: Call to a member function sql_query() on a non-object in D:\DEV\xampp\htdocs\community\includes\cache.php on line 51
Führe ich den entsprechenden Code außerhalb des CMS aus bekomme ich brav ein dbal_mysqli Object. Wobei mir nicht klar ist an welcher Stelle das $db-Objekt erzeugt wird - bin den Code Zeile für Zeile durchgegangen, aber habe nicht finden können, wo das standardmässig geschieht um dem Fehler nachzugehen.
gn#36 hat geschrieben:Ist aber alles aufwändig. Wenn du auf User ohne Cookies verzichten kannst, dann identifiziere anhand des Cookies. Letztlich macht phpBB das ja auch. Wenn du dir die entsprechende Sektion im Code genauer ansiehst kannst du evtl. Teile davon übernehmen.
Ich denke das werde ich auch ersteinmal so machen, wie gesagt die User ohne Cookies sind vertretbar und bekommen einen Hinweis, die Cookies zu aktivieren um alle Funktionen nutzen zu können.

Gruß,
kidata
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Also wenn du die common.php korrekt einbindest, dann sollte dabei auch das DB Objekt initialisiert werden. Bist du sicher, dass du vor dem Include auch die Konstante IN_PHPBB definiert hast und auch die Variable $phpbb_root_path? Ansonsten fuehrt die Datei naehmlich ueberhaupt nichts aus sondern beendet ihre Ausfuehrung sofort ohne irgend etwas zu machen.

Die kritische Frage ist eigentlich: Gibt es in deinem CMS ein Objekt mit der Bezeichnung $db? Wenn ja ist das unguenstig, denn das geraet garantiert in Konflikt mit phpBB. Genauso bei Objekten mit den Namen $user oder $template. $template liesse sich wohl noch verschmerzen sofern du nicht aus versehen deine Templateversion mit der phpBB version ueberschreibst da die phpBB Funktionen die du nutzen willst ohne das Template auskommen sollten. Bei $user oder $db ist das aber kritischer, denn die beiden werden staendig gebraucht und gerade $user ist ziemlich untrennbar mit dem ganzen Loginkram verbunden. Die Probleme mit $db lassen sich evtl. noch umgehen.

Mir kommt gerade noch die Idee, den ganzen phpBB Loginkram innerhalb eines Funktionsaufrufs ausfuehren zu lassen. Auf die Weise koentest du die phpBB Variablen evtl. von den CMS Variablen trennen, da dein CMS global und phpBB innerhalb der Funktion arbeitet. Falls deine PHP Version neu genug ist koennten dir Namespaces unter Umstaenden auch bei der Loesung des Problems behilflich sein (auch wenn sie sicher nicht alle Probleme loesen koennen).

(Sorry fuer die fehlenden Umlaute, ich sitze an einer amerikanischen Tastatur)
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
hackepeter13
Valued Contributor
Beiträge: 3545
Registriert: 21.04.2004 12:22
Wohnort: Berlin
Kontaktdaten:

Beitrag von hackepeter13 »

Ich hatte mir auch schon einige CMS angeschaut und dabei immer Hintergrund 'mit Verbindung zum phpBB3'.
Redaxo ist bei mir ebenfalls eines der vielen CMS, welches ich mir zum anschauen installiert habe.
Nun versuch ich auch das mit dem Login, bin dazu im Redaxo-Forum mal auf dieses Thema gestoßen: HowTo: Ein Login für mehrere Tools (PHPBB, Wiki, etc...)
Klingt von der Sache her interessant, bin aber selber noch nicht dazu gekommen, das dort beschriebene mal durchzuführen.
Benutzeravatar
kidata
Mitglied
Beiträge: 4
Registriert: 09.09.2008 19:21

Beitrag von kidata »

hackepeter13 hat geschrieben: Nun versuch ich auch das mit dem Login, bin dazu im Redaxo-Forum mal auf dieses Thema gestoßen: HowTo: Ein Login für mehrere Tools (PHPBB, Wiki, etc...)
Hab es auch schon mal mit der Snoopy-Klasse versucht, das Login funktioniert erstmal problemlos, nur kommen bei Snoopy keine Cookies an ($snoopy->cookies ist leer) und damit kann ich auch beim Client keine setzen ...
Schickt man das Login-Form direkt an ucp.php?mode=login aus dem REDAXO-Template funktioniert es erstmal tadellos. Ich werde das Login dann evtl noch über eine angepasste ucp.php im Hintergrund per AJAX erledigen.
Benutzeravatar
kidata
Mitglied
Beiträge: 4
Registriert: 09.09.2008 19:21

Beitrag von kidata »

gn#36 hat geschrieben:Also wenn du die common.php korrekt einbindest, dann sollte dabei auch das DB Objekt initialisiert werden. Bist du sicher, dass du vor dem Include auch die Konstante IN_PHPBB definiert hast und auch die Variable $phpbb_root_path? Ansonsten fuehrt die Datei naehmlich ueberhaupt nichts aus sondern beendet ihre Ausfuehrung sofort ohne irgend etwas zu machen.
Ja ich setze IN_PHPBB auf true und habe $phpbb_root_path & $phpEx testweise mal hart gecoded:

Code: Alles auswählen

define('IN_PHPBB', true);
$phpbb_root_path = "D:\\DEV\\xampp\\htdocs\\community\";
$phpEx = "php";
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
die common.php wird erstmal korrekt ausgeführt und $db->sql_connect liefert ein dbal_mysqli-Objekt, nur geht das irgendwie verloren bzw ist nicht mehr im globalen Kontext verfügbar (siehe Fatal Error)
Habe mal das CMS überprüft, $db, $user, $cache & $template werden da nicht verwendet, es sollte also keine Konflikte in der Art geben.
Evtl überschreibt REDAXO aber die GLOBALS ... das muss ich mal genauer überprüfen.
gn#36 hat geschrieben:Mir kommt gerade noch die Idee, den ganzen phpBB Loginkram innerhalb eines Funktionsaufrufs ausfuehren zu lassen. ...
Das werde ich mal noch ausprobieren!
[edit] Auch das führt leider zu dem besagten Fatal Error.
Antworten

Zurück zu „Coding & Technik“