| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 15101 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.acl.advanced">
- <title>Fortgeschrittene Verwendung</title>
- <sect2 id="zend.acl.advanced.storing">
- <title>Dauerhafte Speicherung von ACL Daten</title>
- <para>
- <classname>Zend_Acl</classname> 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
- <classname>Zend_Acl</classname> aufbauen. Viele Situationen erfordern eine interaktive
- Wartung der ACL und <classname>Zend_Acl</classname> stellt Methoden für das Einrichten
- und Abfragen der Zugriffskontrolle einer Anwendung.
- </para>
- <para>
- Die Speicherung der ACL Daten ist deshalb die Aufgabe des Entwicklers, da sich die
- Anwendungsfälle für verschiedene Situationen erwartungsgemäß stark unterscheiden. Da
- <classname>Zend_Acl</classname> serialisierbar ist, können ACL Objekte mit der PHP
- Funktion <ulink url="http://php.net/serialize"><code>serialize()</code></ulink>
- 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.
- </para>
- </sect2>
- <sect2 id="zend.acl.advanced.assertions">
- <title>Schreiben von bedingten ACL Regeln mit Behauptungen</title>
- <para>
- 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.
- <classname>Zend_Acl</classname> bietet eine eingebaute Unterstützung für die
- Implementierung von Regeln, die auf Bedingungen basieren, die der Entwickler benötigt.
- </para>
- <para>
- <classname>Zend_Acl</classname> bietet Unterstützung für bedingte Regel mit dem
- <classname>Zend_Acl_Assert_Interface</classname>. Um das Regelbehauptungsinterface
- benutzen zu können, schreibt der Entwickler eine Klasse, welche die
- <code>assert()</code> Methode des Interfaces implementiert:
- </para>
- <programlisting role="php"><![CDATA[
- class CleanIPAssertion implements Zend_Acl_Assert_Interface
- {
- public function assert(Zend_Acl $acl,
- Zend_Acl_Role_Interface $role = null,
- Zend_Acl_Resource_Interface $resource = null,
- $privilege = null)
- {
- return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
- }
- protected function _isCleanIP($ip)
- {
- // ...
- }
- }
- ]]></programlisting>
- <para>
- 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.
- </para>
- <programlisting role="php"><![CDATA[
- $acl = new Zend_Acl();
- $acl->allow(null, null, null, new CleanIPAssertion());
- ]]></programlisting>
- <para>
- 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.
- </para>
- <para>
- Der <code>assert()</code> Methode eines Behauptungsobjektes werden die ACL, Rolle,
- Ressource and die Rechte übergeben, auf welche die Autorisierungsabfrage (d.h.,
- <code>isAllowed()</code>) passt, um den Kontext für die Behauptungsklasse bereit zu
- stellen, um die Bedingungen zu ermitteln wo erforderlich.
- </para>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|