wie checke ich feuser-Authentifizierung in dbfs.php?

Gesperrt
conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

wie checke ich feuser-Authentifizierung in dbfs.php?

Beitrag 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
php0815
Beiträge: 373
Registriert: Mi 26. Okt 2005, 12:12
Wohnort: Schwarzwald
Kontaktdaten:

Beitrag 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

}
In der Ruhe liegt die Kraft den wer suchet der findet
Wer Rechtschreibfehler findet kann sie behalten, Codefehler können gemeldet werden.
conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

Beitrag 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
conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

Beitrag 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
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag 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
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Gesperrt