WLAN-CMS Dokumentation
unvollständig, under construction, ...
Das Objekt Page
Jede Seite, die ins CMS passen sol, muss bestimmte Regeln befolgen, damit
Kopf und Fuss korrekt angezeigt wird, bzw. die Seite richtig ins Menü
eingegliedert wird.
Das neue System ist objektorientiert.
Ein Objekt repräsentiert nun eine Seite.
Zuerst muss die Datei eingebunden werden, die alle Definitionen enthält:
Page.inc.php
Das Einbinden sollte
- mit require geschehen. Damit wird das Script sofort abgebrochen, falls
die Datei nicht gefunden werden kann.
- mit once geschehen, damit die Datei auch sicher nur einmal eingebunden wird.
Also require_once.
Das kann z.B. so geschehen:
require_once(dirname(__FILE__) . '/inc/Page.inc.php');
oder auch, wenn die Verzeichnisstruktur nicht zu kompliziert ist, einfach
require_once("inc/Page.inc.php");
Als nächstes erstellst du ein Objekt, dass die neue Seite repräsentiert. Der
Typ des Objekts ist die Klasse "Page".
Dem Konstruktur *musst* du __FILE__ übergeben (damit das CMS weiss, in welcher
Datei es sich befindet). Also z.B.:
$page = new Page(__FILE__);
Nun kannst du anfangen, der neuen Seite Attribute zu geben.
Eine Seite muss einen Titel haben. Den setzt du mit Page::SetTitle. Also z.B.:
$page->SetTitle("Das ist der Titel der Seite");
Die MID
Was ist die MID? Die MID ist die Menü-ID. Damit das CMS weiss, wo es im Menü die
Seite einreihen soll, muss eine eine eindeutige(!) ID geben.
Wenn du keine MID zuweist, wird automatisch eine erstellt und zwar so, dass der
Name der Datei in Großbuchstaben umgewandelt wird, der Punkt durch ein _ ersetzt wird.
Daher solltest du diesen Namen dann genauso in der menu.inc.php setzen, oder du
lässt ihn dort auch einfach weg.
Wenn das CMS keine Seite mit der passenden MID finden kann, wird jetzt eine
Fehlermeldung ausgegeben, was die Fehlersuche erleichtert.
Ich werde auch noch eine Überprüfung einbauen, die kontrolliert, ob die MID
eindeutig ist.
Wenn du dir sicher bist, dass der Dateiname eindeutig ist (z.B.
diesedateigibtesimganzensystemnurEINMAL.php), dann kannst du die MID weglassen.
Sonst erstelle einfach einen zufälligen String (der eindeutig sein muss!) und weise
ihn der Seite mit Page::SetMID() zu.
Die gleiche MID muss jedenfalls auch in der menu.inc.php angegeben werden.
Für eine manuelle Zuweisung z.B.:
$page->SetMID('FGH45b4v5vgfhDFG435');
oder
$page->SetMID('EXTERN_PHP4563465456');
Beachte, dass du zwei Seiten in einem Menüpunkt unterbringen kannst, wenn du
ihnen die gleiche MID zuweist.
Das hab ich z.B. bei den Statistiken gemacht.
Seitenoptionen
Eine Seite soll ein bestimmtes Verhalten an den Tag legen, manchmal sollen die
Applets angezeigt werden manchmal nicht.
Bis jetzt gibt es folgende Optionen für eine Seite (die gewiss noch erweitert
werden):
PAGEOPT_NOLEFTROW
verhindert, dass die linke Appletleiste bzw. das Menü angezeigt wird
PAGEOPT_NORIGHTROW
verhindert, dass die rechte Appletleiste angezeigt wird.
Setzen kannst du die Seitenoptionen mit Page::SetPageOption().
z.B.:
// zeige linke leiste nicht an
$page->SetPageOption(PAGEOPT_NOLEFTROW);
// zeige rechte leiste nicht an
$page->SetPageOption(PAGEOPT_NORIGHTROW);
Anzeigen der Seite
Den Header gibst du mit Page::Header() aus, den Footer mit Page::Footer().
Also z.B.:
// davor sollten keine HTML Ausgaben stehen, da alle Header (incl. HTTP-Header
// wie Cookies) erst durch Page::Header() gesetzt werden!
$page->Header();
// Der Inhalt der Seite
$page->Footer();
Sicherheit und Berechtigungen
Neu eingeführt wurde eine Klasse ACLSection, mit der es einfach möglich ist,
Berechtigungen anzugeben und einfach prüfen zu lassen, ob der Besucher für
eine bestimmte Aktion berechtigt ist.
Wenn du z.B. den Text "<p>Geheimtext<p>" nur anzeigen lassen willst, wenn
der Benutzer in der Gruppe intern oder friends ist, dann erstellst du zuerst
ein ACLSection Objekt:
$my_acl = new ACLSection;
Jetzt kannst du dem Objekt zuweisen, wer für die Aktion befugt ist:
$my_acl->AddGroup('intern');
$my_acl->AddGroup('friends');
Jetzt kannst du mit ACLSection::IsAllowed() einfach überprüfen, ob der
gerade angemeldete User die Berechtigung hat:
if($my_acl->IsAllowed())
{
echo "<p>Geheimtext</p>\n";
}
else
{
echo "<p>Du bist nicht berechtigt, den Geheimtext zu sehen</p>\n";
}
Eine ACLSection erlaubt zuerst alles, d.h. wenn du ein leeres Objekt erstellst
und ACLSection::IsAllowed() ausführst, hat jeder Zugriff.
Wenn du ACLSection::SetPublic(false) setzt, dürfen nur mehr Leute zugreifen,
die angemeldet sind.
Bitte beachte, dass ACLSection::AddGroup() die private-Setzung impliziert.
Das bedeutet, dass du es normalerweise so schön machen solltest:
$acl = new ACLSection;
$acl->SetPublic(false);
$acl->AddGroup('intern');
Aber ACLSection kann noch viel mehr (davon ist aber leider noch nicht so viel
implementiert):
Der Konstruktor
Du kannst im Konstruktor bereits angeben, ob die Seite private (also nur
angemeldete User dürfen sie sehen) oder public sein soll:
$acl = new ACLSection(true); // Das gleiche wie new ACLSection()
$acl = new ACLSection(false); // Seite ist privat
ACLSection::SetPublic($pub) // $pub: boolean
Hiermit kannst du bestimmen, ob die der Benutzer angemeldet sein muss, oder
nicht.
ACLSection::SetPrivate($priv) // $priv: boolean
Bewirkt das gleiche wie ACLSection::SetPublic() nur umgekehrt.
ACLSection::SetMode($mode = ACL_ALLOW)
Setzt den Modus des Objektes. Es gibt zwei Modi:
ACL_ALLOW und ACL_DENY.
ACL_ALLOW bedeutet, dass grundsätzlich alles erlaubt ist, das
nicht explizit verboten ist.
ACL_DENY bedeutet, dass grundsätzlich alles verboten ist, was
nicht explizit erlaubt ist.
Im Normalzustand ist der Modus ACL_ALLOW. Das bedeutet, jeder
ist befugt.
Wird die Seite aber private gemacht, wird der Modus automatisch
auf ACL_DENY gesetzt, d.h. nur Mehr Gruppen oder Benutzer, die
explizit angegeben sind, haben einen Zugriff.
ACLSection::AddGroup($gruppe, $modus = ACL_ALLOW)
Fügt eine Gruppe hinzu.
Mit dem zweiten Parameter kann man angeben wie. Normalerweise ist er
auf ACL_ALLOW, d.h. Personen hat Zugriff.
Setzt man ihn auf ACL_DENY, so darf diese Gruppe nicht zugreifen.
ACLSection::RemoveGroup($gruppe, $modus = ACL_ALLOW)
Entfernt einen Eintrag, der zuvor gemacht wurde.
ACLSection::AddUser($user, $modus = ACL_ALLOW)
Funktioniert gleich wie ACLSection::AddGroup, nur mit Usern.
ACLSection::RemoveUser($user, $modus = ACL_ALLOW)
Entfernt einen betreffenden Eintrag, der zuvor gemacht wurde.
ACLSection::AddAddress($addr, $mode = ACL_DENY)
Hier können einzelne Computer oder ganze Netzwerke hinzugefügt
werden, die Zugriff haben sollen.
Gültig sind alle normales UNIX-Angaben, wie z.B.:
192.168.0.200 (IP Adresse)
bloodhound (DNS-Name)
bloodhound.intern.stiftingtal.net (voller DNS-Name)
192.168.0.0/24 (das komplette WLAN)
192.168.0.0 255.255.255.0 (das komplette WLAN)
192.168.0.1 (ianus, also alle externen Besucher)
ACLSection::RemoveAddress($addr, $mode = ACL_DENY)
Dient zum Entfernen eines Eintrags, der zuvor mit ACLSection::AddAddress()
hinzugefügt wurde.
ACLSection::GetReasonGroup()
Falls der Benutzer nicht berechtigt ist, gibt diese Funktion die Gruppe
zurück, an der (falls) die Authentifizierung gescheitert ist.
Das ist z.B. nützlich, um mittels RequireAuth() die passende Meldung
zu erzeugen, oder unterschiedliche Meldungen je nach Berechtigung.
z.B.
if(!$acl->IsAllowed)
{
$group = $acl->GetReasonGroup();
RequireAuth($group);
}
ACLSection::IsAllowed()
Diese Funktion überprüft, ob der aktuell angemeldete Benutzer mit
den zuvor eingegebenen Regeln berechtigt ist.
Gibt entweder true zurück, falls er berechtigt ist, sonst false.
Zusammenfassung
Durch diese Klasse ist es nun einfach möglich, innerhalb von einer Seite
verschiedene Bereiche ('Sections') zu definieren, die alle unterschiedliche
Berechtigungen haben sollen.
Dazu muss einfach für jede Sektion ein neues ACLSection-Objekt erstellt werden.
Rechte einer Seite
Will man nun eine komplette Seite nur einer Gruppe zugänglich machen, so muss
man nicht mehr mühevoll eine eigene ACLSection erstellen, und die über die ganze
Seite strecken; mit der neuen Page-Klasse können für die ganze Seite direkt
Berechtigungen gesetzt werden.
Und zwar liefert Page::GetACL() einen Zeiger auf ein internes ACLSection Objekt
vom Page-Objekt.
Dieses wird im Konstruktor von Page wie ein normales ACLSection Objekt erstellt,
das bedeutet, die Sektion ist public und auf ACL_ALLOW gesetzt.
Will man diese Berechtigungen für die komplette Seite nun ändern, so muss man
sich die Referenz dieses Objektes holen:
$page_acl = &$page->GetACL();
Nun kann man $page_acl wie eine normale ACLSection befüllen.
Ruft man nun Page::Header() auf, und dem Benutzer fehlen die Berechtigungen, so
wird direkt RequireAuth aufgerufen, der Footer angezeigt und das Script beendet.
|