[Gelöst] pbpBB3 Auth. für ext. Scripte (auth_extern.php)

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Dr. Love
Mitglied
Beiträge: 48
Registriert: 24.12.2002 03:24
Wohnort: Düsseldorf
Kontaktdaten:

[Gelöst] pbpBB3 Auth. für ext. Scripte (auth_extern.php)

Beitrag von Dr. Love »

Hallo erst mal, ich log mich nach zwei Jahren das erste mal wieder ein.

Zur Frage: Ich hatte bisher ein (sehr altes) phpBB 2 und habe einige interne Scripte mit dessen Authentifikationssystem gesichert (mit der berühmten auth_extern.php). Einem Umstieg auf das phpBB 3 steht im Moment nur noch die Sicherung eben dieser Scripte entgegen.

Gibt es also auch für das phpBB 3 (schon) eine Möglichkeit, externe Scripte über das Authentifikationssystem des Forums abzusichern? Bietet das System vielleicht gar eine eigene Schnittstelle hierfür? Wie macht ihr das?

Liebe Grüße, Dr. Love
Zuletzt geändert von Dr. Love am 25.05.2007 10:40, insgesamt 1-mal geändert.
Ciao, Dr. Love...
Benutzeravatar
kazwo
Mitglied
Beiträge: 934
Registriert: 29.07.2005 14:10
Wohnort: Mutterstadt des deutschen Fußballs

Beitrag von kazwo »

Hi,

In der Area51 von phpbb.com hat nadermann den Tip gegeben, dass man wegen dem in includes/auth/ nachschaut, Stichwort "authentication plugins".

Ich hoffe das hilft dir.
Blau-Gelb ist nicht Ikea und auch nicht die FDP. Blau-Gelb, das ist die Mannschaft, die ich so gern spielen seh.
Dr. Love
Mitglied
Beiträge: 48
Registriert: 24.12.2002 03:24
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von Dr. Love »

Hmm, damit kann ich so immens schöne Dinge implementieren wie Single-Sign-On aus anderen Systemen heraus. Gute Sache, werden wir in einem anderen Projekt demnächst auch einsetzen. Ich suche jetzt aber was für die andere Richtung. Also etwas, dass den Login-Mechanismus des Boards auch für andere Scripte nutzbar macht, genau wie die gute alte auth_extern.php das gemacht hat (nur vielleicht mit etwas weniger Overhead).

Ich würde also die passenden Klassen bzw. Funktionen des Boards suchen, includen oder klauen, damit das (session-)Cookie mitnutzen und den Zugriff entsprechend freigeben.

Meine Frage ist nun: Hat das schon jemand gemacht? Ist das vielleicht sogar bereits im Code vorgesehen (als Plugin-Schnittstelle oder fertig)? Oder muss ich mich in ruhiger Stunde mit einem Rotwein selber da dran setzen?
Ciao, Dr. Love...
Dr. Love
Mitglied
Beiträge: 48
Registriert: 24.12.2002 03:24
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von Dr. Love »

So, war gar nicht so schwer, viel hat sich an der internen Komminukation im Board nicht getan. Lediglich zwei kleine Veränderungen musste ich an der alten auth_extern.php vornehmen.

Zuerst muss man den Kopf auf folgende Weise anpassen:

Alt:

Code: Alles auswählen

define('IN_PHPBB', true); 
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.' . $phpEx);

// 
// Start session management 
// 
 $userdata = session_pagestart($user_ip, PAGE_INDEX); 
 init_userprefs($userdata); 
// 
// End session management 
//
Neu:

Code: Alles auswählen

define('IN_PHPBB', true);
$phpEx = substr(strrchr(__FILE__, '.'), 1);
$phpbb_root_path = './';
require_once($phpbb_root_path . 'common.' . $phpEx);
// 
// Start session management 
// 
$user->session_begin(); 
// 
// End session management 
//
Kurz gesagt:
1. Es gibt keine extension.inc mehr, das PHP-Suffix wird jetzt direkt abgelesen.
2. Das require_once statt des includes habe ich nur eingebaut, weil ich es für angebracht halte.
3. Das $user-Objekt bietet uns alles, was wir brauchen. Man muss natürlich im Script jetzt alle Vorkommnisse von $userdata durch $user->data ersetzen.


Dann funktioniert das alte Script beinahe schon. Mit einer Ausnahme, die mir den letzten Nerv geraubt hat:

Alt:

Code: Alles auswählen

while( list($group_id, $group_name) = $db->sql_fetchrow($result) )
Neu:

Code: Alles auswählen

while ( $row = $db->sql_fetchrow($result) )
Die Funktion list() erwartet ein nummerisches Array, $db->sql_fetchrow wirft aber ein assoziatives Array aus, so dass das list()-Statement nicht mehr funktioniert. Natürlich muss man beim vorgeschlagegen Workaround $group_id durch $row[group_id] und $group_name durch $row[group_name] ersetzen.

So sieht meine auth_extern.php jetzt also aus:

Code: Alles auswählen

<?php 
/*************************************************************************** 
*              auth_extern.php for phpBB 3.0.x
*              ------------------- 
*  copyright    : ? (C) 2007
*  email        : ? mail 
* 
* 
* uses phpBB technology (c) 2007 phpBB Group <http://www.phpbb.com/> 
* 
***************************************************************************/ 

/* ************************************************************************** 
* 
*  This program is free software; you can redistribute it and/or modify 
*  it under the terms of the GNU General Public License as published by 
*  the Free Software Foundation; either version 2 of the License, or 
*  (at your option) any later version. 
* 
***************************************************************************/ 

define('IN_PHPBB', true);
$phpEx = substr(strrchr(__FILE__, '.'), 1);
$phpbb_root_path = './';
require_once($phpbb_root_path . 'common.' . $phpEx);
// 
// Start session management 
// 
$user->session_begin(); 
// 
// End session management 
//

$access_allowed = false;
if ( in_array($user->data[user_id],$allowed_u) )
{
	$access_allowed = true;
}
else if ( in_array($user->data[username],$allowed_u) )
{
	$access_allowed = true;
}
else
{
	$sql = "SELECT g.group_id, g.group_name
		FROM " . USER_GROUP_TABLE . " ug, " . GROUPS_TABLE . " g
		WHERE ug.user_id = '" . $user->data['user_id'] . "'
			AND g.group_id = ug.group_id";
	if ( !$result = $db->sql_query($sql) )
	{
		die('Konnte die Gruppen nicht aus der Datenbank lesen.');
	}
	$access_allowed = false;
	while ( $row = $db->sql_fetchrow($result) )
	{
		if ( in_array('g'.$row[group_id], $allowed_u) )
		{
			$access_allowed = true;
			break;
		}
		if ( in_array('g'.$row[group_name], $allowed_u) )
		{
			$access_allowed = true;
			break;
		}
	}
	if ( !$access_allowed )
	{ 
		die('Du hast keinen Zugriff auf diese Seite. <a href="'.$phpbb_root_path.'ucp.php?mode=login">Bitte hier einloggen</a> und dann nochmal versuchen. Eventuell hast Du auch einfach keine Berechtigung, diese Seite anzuzeigen.');
	}
}
?>
Hoffentlich kann ich damit jemandem weiter helfen.
Ciao, Dr. Love...
theMomo
Mitglied
Beiträge: 284
Registriert: 07.08.2003 16:17

Beitrag von theMomo »

Hallo Dr. Love,

wenn ich das richtig verstehe, kann ich über dieses File das Login meines Boards für andere Seiten nutzen? Das wäre sozusagen meine Rettung.

Mein Problem: Ich wollte eigentlich erst nicht zu phpbb 3 wechseln, aber nach einigem Testen begeistert es mich sehr. Nun gibt es ja diverse Mods noch nicht für das Forum. Ich brauche aber zum Beispiel die Spieleseite weiterhin. Könnte ich die so im alten Forum stehen lassen und über dieses File direkt auf die Seite verlinken? Oder bin ich hier völlig auf dem Holzweg? Wenn das funktionieren würde, wo finde ich die auth_extern.php?

Vielen Dank schon mal

Momo
Dr. Love
Mitglied
Beiträge: 48
Registriert: 24.12.2002 03:24
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von Dr. Love »

Zwei Foren gleichzeitig nutzen würde etwas schwierig werden, aber dazu bräuchte man keine auth_extern.php. Oder verstehe ich Dich falsch?

Sie ist eher dazu gedacht, um beliebige Seiten nur für bestimmte Gruppen sichtbar zu machen. Wir haben so ein Interviewsystem für unsere Mitglieder und noch anderen Firlefanz, der nicht öffentlich sein soll. Das kann man prima mit der auth_extern.php absichern.
Wenn das funktionieren würde, wo finde ich die auth_extern.php?
Ein Post über Dir :)

Am besten speichert man den geposteten Quelltext in eine eigene Datei und bindet ihn in die zu schützenden Skripte ein:

Code: Alles auswählen

<?php
$allowed_u = array();
$allowed_u = '1'; # User mit der ID 1 darf zugreifen
$allowed_u = 'Ben Utzer'; # User mit dem Namen 'Ben Utzer' darf zugreifen
$allowed_u = 'g12'; # Gruppe mit der ID 12 darf zugreifen
$allowed_u = 'gEingeweihte Gruppe'; # Gruppe mit dem Namen 'Eingeweihte Gruppe' darf zugreifen

# Jetzt wird die auth_extern.php eingebunden
# Nur die oben definierten User und Gruppen bekommen die Seite zu sehen
# alle anderen nur die Fehlermeldung ganz unten
require_once($pfad_zu_auth_extern . 'auth_extern.php');
?>
Zu schützender Content ab hier...
Ach ja, in der Auth_extern.php - wo auch immer man sie abspeichert - nicht vergessen, den $phpbb_root_path (relativer Pfad zum Forum) korrekt zu setzen, sonst klappt es natürlich nicht.
Ciao, Dr. Love...
theMomo
Mitglied
Beiträge: 284
Registriert: 07.08.2003 16:17

Beitrag von theMomo »

Vielen Dank. Ich glaube, ich hatte das falsch verstanden. Kann das Script aber trotzdem gut gebrauchen. Danke nochmal. :grin:
kittplanet
Mitglied
Beiträge: 3
Registriert: 12.06.2007 20:26

Beitrag von kittplanet »

Guten Tag!

Heisst das, das ich hier eine Lexikonscript z.B. einfach die auth nehmen kann, um denn namen des eingeloggten boardusers als einfüger einzufügen?
*gg* scheiss satz!

Und natürlich auf die usergruppe bezogen? :P *gg*
Dr. Love
Mitglied
Beiträge: 48
Registriert: 24.12.2002 03:24
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von Dr. Love »

Das komplette $user-Objekt steht zur Verfügung. Die Gruppen muss man mit ner SQL-Abfrage allerdings selber heraus finden.
Ciao, Dr. Love...
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“