Seite 1 von 1

wie checke ich feuser-Authentifizierung in dbfs.php?

Verfasst: Do 22. Mär 2007, 22:03
von conradius
kann mir jemand sagen, welche(s) file(s) ich in der Datei /mandant/dbfs.php includen muss, damit ich dort einen Frontenduser-Authentifizierungs-Check machen kann?

Die Idee ist, dass wenn der Besucher z.B. auf einen dbfs-PDF-Link klickt, aber nicht eingeloggt ist, automatisch zur Login-Seite weitergeleitet wird, anstelle einer weissen Seite zu erhalten.

Ich hätte mir das wie weiter unten folgt vorgestellt, klappt aber nicht. $auth->auth["uname"] ist leer, egal ob eingeloggt oder nicht. Dies, obwohl in der dbfs.php von mir aus gesehen alle notwendigen includes gemacht werden:

Code: Alles auswählen

include_once ("config.php");
include_once ($contenido_path . "includes/startup.php");
cInclude("includes", "functions.general.php");
/* Shorten load time */
$client = $load_client;
Oder welche Datei muss ich, für $auth->auth["uname"] oder ..["uid"] zu erhalten, einbinden?

Eingeloggt erhalte ich die Datei, nicht eingeloggt klappt die if-Bedingung aber nicht.

Oder sieht jemand einen Fehler in meiner kleinen Erweiterung:

Code: Alles auswählen

if ($auth->auth["uname"] == "nobody") {
	if (!is_object($properties)) {
		$properties = new PropertyCollection;
		} // end if
	header('location:front_content.php?idcatart='.$properties->getValue("clientsetting", $client, "feuser_login_form", "idcatart").'&file='.$file);
	} // end if
Der Link ist korrekt, header kann ohne Bedingung (also bei eingeloggtem User) ausgeführt werden...

Danke für Eure Hinweise/Infos, irgendwo steh ich wohl auf dem Schlauch.
Die verwendete Contenido Version ist 4.6.15.

Gruss,
Conradius

Verfasst: Fr 23. Mär 2007, 03:46
von php0815

Code: Alles auswählen

$frontendusers = new FrontendUserCollection;
$frontendusers->select("idclient = '$client' AND username = '".urlencode($auth->auth[uname])."'");
if ($frontenduser = $frontendusers->next()) {
   $idfrontend    = $frontenduser->get("idfrontenduser");

   $strMsg = "";

$oFEUsers = new FrontendUserCollection;
$oFEUsers->setOrder("username");
$oFEUsers->query();
// Hier der Code wenn er eingelogt ist
}
else
{
// Hier der Code wenn er nicht eingelogt ist

}

Verfasst: Fr 23. Mär 2007, 10:19
von conradius
hallo php0815,
Danke für Deinen Stups!
Es würde auch so klappen, wie ich es gedacht hatte, nur müsste ich dazu vermutlich die Authentifizierungsabfrage nach und nicht vor dem folgenden Block setzen: :oops:

Code: Alles auswählen

if ($contenido) {
    page_open(array('sess' => 'Contenido_Session',
                    'auth' => 'Contenido_Challenge_Crypt_Auth',
                    'perm' => 'Contenido_Perm'));
} else {
    page_open(array('sess' => 'Contenido_Frontend_Session',
                    'auth' => 'Contenido_Frontend_Challenge_Crypt_Auth',
                    'perm' => 'Contenido_Perm'));
	} // end if
...UND: Die Lektüre von http://de.php.net/header half mir auf die Sprünge, denn nach einem

Code: Alles auswählen

header();
darf kein Code mehr ausgeführt werden! Ich habe also ein

Code: Alles auswählen

exit;
vergessen... :oops:

Nun denn, jetzt klappts, und wenn jemand anderes diesen Code auch braucht, voilà:

Code: Alles auswählen

<?php
include_once ("config.php");
include_once ($contenido_path . "includes/startup.php");
cInclude("includes", "functions.general.php");

cInclude("classes", "class.dbfs.php");

if ($contenido) {
    page_open(array('sess' => 'Contenido_Session',
                    'auth' => 'Contenido_Challenge_Crypt_Auth',
                    'perm' => 'Contenido_Perm'));
} else {
    page_open(array('sess' => 'Contenido_Frontend_Session',
                    'auth' => 'Contenido_Frontend_Challenge_Crypt_Auth',
                    'perm' => 'Contenido_Perm'));
	} // end if

/* Shorten load time */
$client = $load_client;

if ($auth->auth["uid"] == "nobody") {
	// redirect user to feuser_login_form, if not logged in
	if (!is_object($properties)) {
		$properties = new PropertyCollection;
		} // end if
	header('location:front_content.php?idcatart='.$properties->getValue("clientsetting", $client, "feuser_login_form", "idcatart").'&file='.urlencode($file));
	exit;
	} // end if

$dbfs = new DBFSCollection;
$dbfs->outputFile($file);
page_close();
?>
Eigentlich wäre das etwas, das Contenido von Haus aus können sollte: Falls nicht eingeloggt ein redirect zu einer client-property à la "feuser-login-form". Wäre vielleicht was zum Einbauen? (Dann muss ich bei einem Update nicht an meine geänderte dbfs.php denken... :D )
Das file gebe ich mit, damit nach einem erfolgreichen Login der User seine gewünschte Datei erhält, das macht dann das Login-Modul wieder mit einem

Code: Alles auswählen

header('location:'.urldecode($_GET['file']))
oder so.

beste Grüsse mit viiel Schnee!!
Conradius

Verfasst: Fr 23. Mär 2007, 11:10
von conradius
Ein wichtiger Hinweis noch zu dieser Manipulation!
Mit diesem simplen Check (ob eingeloggt oder nicht), hat man natürlich noch keinen feingranularen Schutzmechanismus!
D.h. wenn der User eingeloggt ist, kriegt er die Datei, sonst nicht. Gruppen und deren Berechtigungen oder so was Ähnliches werden so (noch) nicht überprüft! Aber die Datei ist jedenfalls mal nicht einfach so öffentlich erreichbar. Der Besucher muss uns zuerst sagen, wer er ist.

nur so...

Gruss,
Conradius

Verfasst: Fr 23. Mär 2007, 17:53
von HerrB
Ähm, der Vollständigkeit halber: Die Prüfung, ob man zum Zugriff auf eine DBFS-Datei berechtigt ist, macht Contenido bereits von Hause aus (siehe class.dbfs.php, outputFile). Die Einstellung erfolgt über die Eigenschaften in der Dateiverwaltung.

Nur erhält man halt ein "403 Forbidden"-Fehler, wenn man es versucht und nicht angemeldet ist.

Der hier gepostete Ansatz verhindert, dass irgendeine Datei via dbfs abgerufen wird, solange man nicht angemeldet ist (unabhängig von der Einstellung für die Datei).

Gruß
HerrB