Fortgeschrittene Verwendung
Dauerhafte Speicherung von ACL Daten
Zend_Acl wurde so entwickelt, dass keine spezielle Backend
Technologie benötigt wird, wie z.B. eine Datenbank oder ein Cache Server, um die ACL
Daten zu speichern. Die vollständige PHP Implementation ermöglicht angepasste
Administrationstools, die relativ einfach und flexibel auf
Zend_Acl aufbauen. Viele Situationen erfordern eine interaktive
Wartung der ACL und Zend_Acl stellt Methoden für das Einrichten
und Abfragen der Zugriffskontrolle einer Anwendung.
Die Speicherung der ACL Daten ist deshalb die Aufgabe des Entwicklers, da sich die
Anwendungsfälle für verschiedene Situationen erwartungsgemäß stark unterscheiden. Da
Zend_Acl serialisierbar ist, können ACL Objekte mit der PHP
Funktion serialize()
serialisiert werden und das Ergebnis kann überall gespeichert werden, wo es der
Entwickler möchte, wie z.B. eine Datei, eine Datenbank oder ein Cache Mechanismus.
Schreiben von bedingten ACL Regeln mit Behauptungen
Manchmal soll eine Regel für das Erlauben oder Verbieten des Zugriffs auf eine Ressource
nicht absolut sein, sondern von verschiedenen Kriterien abhängen. Zum Beispiel, nehmen
wir an, dass ein bestimmter Zugriff erlaubt sei, aber nur zwischen 08:00 und 17:00 Uhr.
Ein anderes Beispiel könnte sein, dass der Zugriff verboten wird, weil eine Anfrage von
einer bestimmten IP Addresse kommt, die als Missbrauchsquelle markiert worden ist.
Zend_Acl bietet eine eingebaute Unterstützung für die
Implementierung von Regeln, die auf Bedingungen basieren, die der Entwickler benötigt.
Zend_Acl bietet Unterstützung für bedingte Regel mit dem
Zend_Acl_Assert_Interface. Um das Regelbehauptungsinterface
benutzen zu können, schreibt der Entwickler eine Klasse, welche die
assert() Methode des Interfaces implementiert:
_isCleanIP($_SERVER['REMOTE_ADDR']);
}
protected function _isCleanIP($ip)
{
// ...
}
}
]]>
Sobald eine Behauptungsklasse verfügbar ist, muss der Entwickler eine Instanz dieser
Aussageklasse bei der Zuordnung bedingte Regeln übergeben. Eine Regel, die mit einer
Behauptung angelegt wird, wird nur angewendet, wenn die Behauptungsmethode true
zurück gibt.
allow(null, null, null, new CleanIPAssertion());
]]>
Der obige Code legt eine bedingte Erlaubnisregel an, die den Zugriff für alle Rechte
auf alles und von jedem erlaubt, außer wenn die anfordernde IP auf einer "Blacklist"
ist. Wenn die Anfrage von einer IP kommt, die nicht als "sauber" betrachtet wird, wird
die Erlaubnisregel nicht angewandt. Da die Regel auf alle Rollen, alle Ressourcen und
alle Rechte zutrifft, würde eine "unsaubere" IP zu einem Zugriffsverbot führen. Dies
ist ein besonderer Fall und es sollte verstanden werden, dass in allen anderen Fällen
(d.h. wenn eine spezielle Rolle, Ressource oder Recht für die Regel spezifiziert wird)
eine fehlerhafte Behauptung dazu führt, dass die Regel nicht angewandt wird und andere
Regeln verwendet werden, um zu ermittel, ob der Zugriff erlaubt oder verboten ist.
Der assert() Methode eines Behauptungsobjektes werden die ACL, Rolle,
Ressource and die Rechte übergeben, auf welche die Autorisierungsabfrage (d.h.,
isAllowed()) passt, um den Kontext für die Behauptungsklasse bereit zu
stellen, um die Bedingungen zu ermitteln wo erforderlich.