Seite 1 von 1

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

Verfasst: 22.05.2007 19:00
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

Verfasst: 22.05.2007 19:23
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.

Verfasst: 22.05.2007 22:45
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?

Verfasst: 24.05.2007 17:20
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.

Verfasst: 26.05.2007 20:29
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

Verfasst: 27.05.2007 12:12
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.

Verfasst: 27.05.2007 12:15
von theMomo
Vielen Dank. Ich glaube, ich hatte das falsch verstanden. Kann das Script aber trotzdem gut gebrauchen. Danke nochmal. :grin:

Verfasst: 12.06.2007 20:31
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*

Verfasst: 12.06.2007 21:48
von Dr. Love
Das komplette $user-Objekt steht zur Verfügung. Die Gruppen muss man mit ner SQL-Abfrage allerdings selber heraus finden.