<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zorta &#187; Tutorials</title>
	<atom:link href="http://www.zorta.de/category/tuts/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zorta.de</link>
	<description>Nähkästchen eines Webentwicklers</description>
	<lastBuildDate>Sat, 29 Oct 2011 20:08:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Sicherheit bei Zend_Form</title>
		<link>http://www.zorta.de/frameworks/zend-framework/sicherheit-bei-zend_form/</link>
		<comments>http://www.zorta.de/frameworks/zend-framework/sicherheit-bei-zend_form/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 20:07:36 +0000</pubDate>
		<dc:creator>Denis Zunke</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Zend_Form]]></category>

		<guid isPermaLink="false">http://www.zorta.de/?p=304</guid>
		<description><![CDATA[Das Zend Framework bietet viele Möglichkeiten uns Arbeit abzunehmen und vergisst dabei auch die Sicherheit nicht. Allerdings bin ich nun schon öfters auf Quellcode getroffen bei dem der Form-Teil des Zend Frameworks falsch eingesetzt wurde. So erfüllt Zend_Form auch den Zweck, dass wir sichere Inhalte von Elementen erhalten. Man kann auch Filter anwenden. Aber all [...]]]></description>
			<content:encoded><![CDATA[<p>Das Zend Framework bietet viele Möglichkeiten uns Arbeit abzunehmen und vergisst dabei auch die Sicherheit nicht. Allerdings bin ich nun schon öfters auf Quellcode getroffen bei dem der Form-Teil des Zend Frameworks falsch eingesetzt wurde. So erfüllt Zend_Form auch den Zweck, dass wir sichere Inhalte von Elementen erhalten. Man kann auch Filter anwenden. Aber all dies bringt nichts, wenn man dann doch direkt auf die Werte über die globale $_POST zugreift. Man hat davon einfach nichts. Die Werte wurden nicht überprüft, sind damit <strong>unsicher</strong>, und sind durch keine Filter gelaufen.</p>
<p>Deshalb der Appell an jene, die die Bibliothek es falsch verwenden.</p>
<p>FALSCH:</p>
<pre class="brush: php">if ($form-&gt;isValid) {

$objekt = new Test_Object();
$objekt-&gt;property1 = $_POST[&#039;property1&#039;];

}</pre>
<p>RICHTIG:</p>
<pre class="brush: php">if ($form-&gt;isValid) {

$objekt = new Test_Object();
$objekt-&gt;property1 = $form-&gt;getValue(&#039;property1&#039;);

}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.zorta.de/frameworks/zend-framework/sicherheit-bei-zend_form/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zugriff auf WordPress XML-RPC-Server mit Zend</title>
		<link>http://www.zorta.de/frameworks/zend-framework/zugriff-auf-wordpress-xml-rpc-server-mit-zend/</link>
		<comments>http://www.zorta.de/frameworks/zend-framework/zugriff-auf-wordpress-xml-rpc-server-mit-zend/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 10:05:22 +0000</pubDate>
		<dc:creator>Denis Zunke</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://www.zorta.de/?p=289</guid>
		<description><![CDATA[Es ist eigentlich recht plausibel, dass ich kurz vorstelle wie man auf WordPress per XML-RPC zugreift, wenn ich schon beschreibe, wie man den Server erweitern kann. Das Wichtigste dabei ist, dass man den Server in den Einstellungen seines WordPress aktiviert. Dazu benötigt man nur einen kleinen Haken, der sich unter Einstellungen / Schreiben findet. Nachdem [...]]]></description>
			<content:encoded><![CDATA[<p>Es ist eigentlich recht plausibel, dass ich kurz vorstelle wie man auf WordPress per XML-RPC zugreift, wenn ich schon <a href="http://www.zorta.de/tuts/erweiterung-der-wordpress-xml-rpc-schnittstelle/">beschreibe</a>, wie man den Server erweitern kann. </p>
<p>Das Wichtigste dabei ist, dass man den Server in den Einstellungen seines WordPress aktiviert. Dazu benötigt man nur einen kleinen Haken, der sich unter Einstellungen / Schreiben findet. Nachdem die Einstellung gespeichert ist könnt ihr anfangen mit Zend auf die Schnittstelle zuzugreifen.</p>
<p><span id="more-289"></span></p>
<p>Das Zend Framework bietet uns hier bereits einen fertigen Client, der all die nervigen Arbeiten abnimmt. Um die Verbindung zur API herzustellen bedarf es dank dieser Hilfe nur einer Zeile.</p>
<pre class="brush: php">$xmlClient = new Zend_XmlRpc_Client(&#039;http://www.dein-blog.de/xmlrpc.php&#039;);</pre>
<p>Eine genaue Beschreibung zum XML-RPC-Client des Zend Framework findet man natürlich entsprechend im <a href="http://framework.zend.com/manual/de/zend.xmlrpc.client.html">Reference-Guide</a>. Ich möchte nun von meinem Blog die Posts einer Kategorie abrufen. Dazu gab es bereits die Erweiterung des XML-RPC-Servers. Die Funktionen aufzurufen ist dann nur noch ein kleiner Schritt.</p>
<pre class="brush: php">$data = $xmlClient-&gt;call(
    &#039;zorta.postsbycategory&#039;,
    array(
        &#039;username&#039;	=&gt; &#039;BENUTZERNAME&#039;,
        &#039;password&#039;	=&gt; &#039;PASSWORT&#039;,
        &#039;category&#039;	=&gt; KATEGORIE-ID
    )
);</pre>
<p>Als Benutzername und Passwort übergibt man dem Aufruf die Daten seines Benutzers für den WordPress-Blog. Die Daten kann man nun über eine Array-Behandlung einfach ausgeben oder weiterverarbeiten. </p>
<p>Eine eher mangelhafte Aufführung der vorhandenen XML-RPC-Methoden findet man bei <a href="http://codex.wordpress.org/XML-RPC_wp">WordPress</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zorta.de/frameworks/zend-framework/zugriff-auf-wordpress-xml-rpc-server-mit-zend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erweiterung der WordPress XML-RPC-Schnittstelle</title>
		<link>http://www.zorta.de/tuts/erweiterung-der-wordpress-xml-rpc-schnittstelle/</link>
		<comments>http://www.zorta.de/tuts/erweiterung-der-wordpress-xml-rpc-schnittstelle/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 17:59:45 +0000</pubDate>
		<dc:creator>Denis Zunke</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://www.zorta.de/?p=285</guid>
		<description><![CDATA[Ich stand vor kurzem vor dem Problem, dass ich Daten von WordPress in einem anderen Projekt haben wollte. Es ging mir einfach darum die Posts einer Kategorie auszulesen und dort anzuzeigen. Natürlich griff ich damit auf die XML-RPC-Schnittstelle von WordPress zurück, da man nicht den Weg über die Datenbank gehen sollte. Die Datenbanken liegen zwar [...]]]></description>
			<content:encoded><![CDATA[<p>Ich stand vor kurzem vor dem Problem, dass ich Daten von WordPress in einem anderen Projekt haben wollte. Es ging mir einfach darum die Posts einer Kategorie auszulesen und dort anzuzeigen. Natürlich griff ich damit auf die XML-RPC-Schnittstelle von WordPress zurück, da man nicht den Weg über die Datenbank gehen sollte. Die Datenbanken liegen zwar auf dem gleichen Server, aber irgendwo sollten die Projekte getrennt sein. Es macht auch keinen Sinn die WordPress-Datenbank auszulesen, wenn ein abhängiges Projekt einmal auf einen anderen Server wechseln sollte. </p>
<p>Das Einarbeiten in die Schnittstelle ist recht simpel. WordPress selber bietet dafür zwar wenig Hilfe, aber mit etwas Geschick findet man sie im Netz. Leider ist die Schnittstelle aber nicht gerade ausgereift und liefert allerlei Lücken und Unstimmigkeiten. Zum Beispiel ist die Übertragung von Benutzernamen und Passwort unterschiedlich. Es gibt Funktionen, da muss man erst den Benutzernamen und dann das Passwort übertragen, aber wiederum gibt es Funktionen bei denen man erst eine BlogId (Es war wohl einmal angedacht mehrere Blogs über eine Plattform betreiben zu können) und dann erst Benutzernamen und Passwort übertragen. Dann gibt es auch noch Funktionalitäten, die man eigentlich erwartet, die aber gar nicht Verfügbar sind. </p>
<p>Es gibt keine Funktion in der Schnittstelle um die Posts einer Kategorie abzurufen. Um diese Tücken zu umgehen kann man sich auf einen recht einfachen Wege eine Erweiterung der Schnittstelle entwickeln. Ich habe mich entschlossen dieses über ein Plugin zu tun. Das brachte dann auch schnell den Vorteil mit, dass ich Objektorientiert an die Sache herangehen konnte. </p>
<p><span id="more-285"></span></p>
<p>Man beginnt also damit, dass man sich ein Plugin anlegt. Das Grundgerüst dafür sieht einfach aus. Eine PHP-Datei. Diese Datei benötigt einen Kommentierten Kopf, damit WordPress sie als Plugin erkennt. </p>
<pre class="brush: php">/*
Plugin Name: Zorta XML-RPC
Plugin URI: http://www.zorta.de
Description: The Plugin adds some functions to the WordPress XML-RPC Library
Author: Denis Zunke
Version: 1.0
Author URI: http://www.zorta.de/
*/

include_once(ABSPATH . WPINC . &#039;/class-IXR.php&#039;);
include_once(ABSPATH . WPINC . &#039;/class-wp-xmlrpc-server.php&#039;);

class Zorta_XMLRPC extends wp_xmlrpc_server {

    public static function zorta_getName()
    {
        return __CLASS__;
    }

}
add_filter(&#039;wp_xmlrpc_server_class&#039;, array(&#039;Zorta_XMLRPC&#039;, &#039;zorta_getName&#039;));</pre>
<p>Mit dieser einfachen Datei hat man ein lauffähiges Plugin ohne Funktionalität. Ich habe es nicht ausprobiert, aber würde in diesem Falle davon ausgehen, dass man die XML-RPC-Schnittstelle von WordPress noch nicht überschrieben hat. Sie dürfte also weiter zur Verfügung stehen. Der nächste Schritt war für mich, dass ich eine Art &#8220;Hallo Welt&#8221;-Funktion einbaue um zu sehen, ob meine Schnittstelle ansprechbar ist. Diese Funktion musste ich aber nun auch offiziell ansprechbar machen, weshalb ich mich entschloss den Konstructor des eigentlichen XML-RPC-Servers zu überschreiben.</p>
<pre class="brush: php">public function __construct()
{
    parent::__construct();
    $methods = array(
       &#039;zorta.helloworld&#039;        =&gt; &#039;this:zorta_HelloWorld&#039;
    );
    $this-&gt;methods = array_merge($this-&gt;methods, $methods);
}

public function zorta_HelloWorld()
{
    return &#039;Hallo Welt!&#039;;
}</pre>
<p>Diese Funktion aufgerufen war zu erkennen, dass ich alles richtig gemacht habe und mein &#8220;Hallo Welt&#8221; als Response-Wert bekam. Jetzt konnte ich versuchen über eine weitere Funktion auf die Methodiken von WordPress zuzugreifen um letztendlich meine Kategorien abrufen zu können. Im Handbuch von WordPress nachgeschlagen fand ich auch eine Funktion um das zu tun. Um die Funktion der Schnittstelle bekannt zu machen musste sie zuerst einmal geschrieben werden.</p>
<pre class="brush: php">public function zorta_PostsByCategory($args)
{
    return get_posts(array(&#039;category&#039; =&gt; $args[0]));
}</pre>
<p>Die Variable <em>$args</em> bezeichnet in diesem Moment die übergebenen Parameter. Dies liest WordPress selbstständig aus dem übergebenen XML aus, da wir die grundlegenden Funktionalitäten des XML-RPC-Servers nicht überschrieben haben. Diese Methodik musste nun aber auch im Konstruktor noch hinzugefügt werden.</p>
<pre class="brush: php">$methods = array(
     &#039;zorta.helloworld&#039;             =&gt; &#039;this:zorta_HelloWorld&#039;,
     &#039;zorta.postsbycategory&#039;    =&gt; &#039;this:zorta_PostsByCategory&#039;
);</pre>
<p>Jetzt war es mir möglich von außen meine Posts aus einer beliebigen Kategorie abzurufen. Da dies aber zu unsicher ist brauchte ich auch noch einen Login. Es sollte schließlich nicht jeder auf die Schnittstelle zugreifen können. Auch dafür liefert der WordPress XML-RPC-Server eine Funktionalität, die ich in meiner Klasse verwenden konnte. </p>
<pre class="brush: php">if ($this-&gt;_zorta_login($args)) {
    if (isset($args[2])) {
        return get_posts(array(&#039;category&#039; =&gt; $args[2]));
    } else {
        return &#039;There must be a category (2)&#039;;
    }
} else {
   return $this-&gt;error;
}</pre>
<p>Wie schnell auffällt übergebe ich die kompletten Parameter an eine Funktion, die nicht definiert ist. Eine eigene Login-Funktion. Dies hängt damit zusammen, dass ich eine zentrale Stelle für den Login in meiner Klasse haben wollte. Sie gibt auch vor, dass das erste Argument der Benutzername und das zweite Argument das Passwort sind. Auf diese Weise muss ich dies nicht in jeder neuen Funktion definieren, da ich nur einmal die kompletten Parameter übergebe. Diese Login Funktion ist recht simpel.</p>
<pre class="brush: php">private function _zorta_login($args)
{
    $username = $args[0];
    $password = $args[1];

    if ($this-&gt;login($username, $password)) {
        return true;
    } else {
        return false;
    }
}</pre>
<p>Nun sind alle Funktionen beisamen für eine minimale Erweiterung des XML-RPC-Servers. Alles zusammen gefasst ergibt eine einfache Basis zur Erweiterung der Schnittstelle, die WordPress einem bietet. Es gibt viele Gründe warum man das WordPress-Backend für seine eigene Arbeit nutzen kann, schließlich muss man nicht immer alles neu erfinden. </p>
<p>Nun aber auch noch einmal die gesamte Klasse zum Download: <a href="http://www.zorta.de/wp-content/uploads/2011/06/zorta-wp-xmlrpc.zip">zorta-wp-xmlrpc.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zorta.de/tuts/erweiterung-der-wordpress-xml-rpc-schnittstelle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plugin installieren bei Redmine</title>
		<link>http://www.zorta.de/allgemein/plugin-installieren-bei-redmine/</link>
		<comments>http://www.zorta.de/allgemein/plugin-installieren-bei-redmine/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 19:07:03 +0000</pubDate>
		<dc:creator>Denis Zunke</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Redmine]]></category>

		<guid isPermaLink="false">http://www.zorta.de/?p=251</guid>
		<description><![CDATA[Ich wollte heute das erste mal ein Plugin bei meinem Redmine-System installieren. Leider musste ich feststellen, dass die Anleitung bei Redmine dazu ziemlich schlecht ist. In Schritt zwei wird gesagt, dass man einen Befhel, der natürlich angegeben ist, ausführen soll, wenn DB-Updates benötigt werden. Schritt 3 sagt dann, dass man Redmine neustarten soll. Ich hatte [...]]]></description>
			<content:encoded><![CDATA[<p>Ich wollte heute das erste mal ein Plugin bei meinem Redmine-System installieren. Leider musste ich feststellen, dass die <a href="http://www.redmine.org/projects/redmine/wiki/Plugins">Anleitung</a> bei Redmine dazu ziemlich schlecht ist. In Schritt zwei wird gesagt, dass man einen Befhel, der natürlich angegeben ist, ausführen soll, wenn DB-Updates benötigt werden. Schritt 3 sagt dann, dass man Redmine neustarten soll. </p>
<p>Ich hatte kein Plugin, dass Datenbankupdates benötigt, aber dennoch funktionierte es nicht. Ich scheiterte schon daran Redmine neuzustarten. Warum? Dafür wurde keine Beschreibung angegeben. Nachdem ich den Hinweis gefunden hatte und Redmine erfolgreich neustarten konnte war mein Plugin aber immer noch nicht in der Liste der Plugins. Nach etwas suchen habe ich dann die Lösung zusammengefunden. Seltsamerweise musste ich dazu die Anleitung eines gänzlich anderen Plugins bemühen, das dann endlich die ersehnte Erklärung hatte.</p>
<p>Diese Erklärung ist eigentlich recht simpel.</p>
<blockquote><p><strong>Schritt 1</strong>:<br />
Man läd das Plugin in das Verzeichnis <em>/vendor/plugins</em>. Dort muss das gesamte Verzeichnis des Plugins hinterlegen.</p>
<p><strong>Schritt 2</strong>:<br />
Man muss die Plugins laden. Dazu verwendet man den Befehl<br />
<code>RAILS_ENV=production rake db:migrate_plugins</code></p>
<p><strong>Schritt 3</strong>:<br />
Redmine muss neugestartet werden. Dazu hinterlegt man im Verzeichnis <em>/tmp</em> eine leere Datei <em>restart.txt</em>. Man läd die Startseite von Redmine neu und der Neustart läuft im Hintergrund. </p></blockquote>
<p>Nun sollte das Plugin in der Administration unter Plugins auftauchen. Viel Erfolg!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zorta.de/allgemein/plugin-installieren-bei-redmine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Acl mit Ini Konfiguration und Resourcen</title>
		<link>http://www.zorta.de/frameworks/zend-framework/zend-acl-mit-ini-konfiguration-und-resourcen/</link>
		<comments>http://www.zorta.de/frameworks/zend-framework/zend-acl-mit-ini-konfiguration-und-resourcen/#comments</comments>
		<pubDate>Mon, 09 May 2011 20:32:10 +0000</pubDate>
		<dc:creator>Denis Zunke</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Acl]]></category>
		<category><![CDATA[Zend_Application]]></category>
		<category><![CDATA[Zend_Config_Ini]]></category>

		<guid isPermaLink="false">http://www.zorta.de/?p=234</guid>
		<description><![CDATA[Ich hatte bereits einmal einen Artikel über eine Acl mit INI Konfiguration. Dort gab es einen Kommentar von evilmonkey, den ich sehr anregend fand und mir nun einmal die Zeit genommen habe diesen umzusetzen. Die Konfiguration basiert auf einer Zend_Acl und wird mit einer Ini Datei über Zend_Config_Ini befüllt. Das ganze funktioniert als Resource mit [...]]]></description>
			<content:encoded><![CDATA[<p>Ich hatte bereits einmal einen <a href="http://www.zorta.de/frameworks/ein-einfaches-acl-system-uber-zend_config_ini/">Artikel</a> über eine Acl mit INI Konfiguration. Dort gab es einen Kommentar von evilmonkey, den ich sehr anregend fand und mir nun einmal die Zeit genommen habe diesen umzusetzen.</p>
<p>Die Konfiguration basiert auf einer Zend_Acl und wird mit einer Ini Datei über Zend_Config_Ini befüllt. Das ganze funktioniert als Resource mit dem Bootstrapping. Vielleicht ist es für den ein oder anderen eine Anregung. </p>
<p><span id="more-234"></span></p>
<p>Erst einmal die Konfiguration. Wie man sieht ist es eine normale Ini-Datei mit Vererbung. Ganz nach dem Kommentar gilt dabei das Muster {|*}.{|*} = {allow|deny}</p>
<p><code>[guest]<br />
index.* = allow<br />
error.* = allow</p>
<p>[user : guest]<br />
dashboard.* = allow</p>
<p>[admin : user]<br />
*.* = allow</code></p>
<p>Diese Konfiguration kann in der Application Ini gesetzt werden. Die Resource unterstützt drei Einstellungen. </p>
<p><code>resources.acl.active = true<br />
resources.acl.config = APPLICATION_PATH "/configs/acl.ini"<br />
resources.acl.base   = deny</code></p>
<p>Die Einstellungen sind einfach erklärt. Es gibt zuerst einmal eine Einstellung um die Resource zu aktivieren oder zu deaktivieren. Ich finde eine autarke Einstellung abseits der application.ini wertvoll und nutze sie daher gerne. Dann muss natürlich der Pfad zur Konfiguration gesetzt werden und zuletzt was die ACL als Basis macht. Hier ist als Einstellung allow oder deny vorgesehen. Das bedeutet, dass entweder als Basis alle Resourcen verboten werden oder alle erlaubt.</p>
<p>Wie man sehen wird habe ich die Acl überschrieben mit einer Erweiterung der Funktion isAllowed(). Dies nutzt dem Zweck automatisch Rollen und Resourcen zur Acl hinzuzufügen, die noch nicht konfiguriert sind. Diese werden im Standard verboten, da es sich ja eigentlich immer um nicht vorhandene Resourcen oder Rollen handelt. </p>
<pre class="brush: php">class Suka_Acl extends Zend_Acl {

	/**
	 * (non-PHPdoc)
	 * @see Zend_Acl::isAllowed()
	 */
	public function isAllowed($role = null, $resource = null, $privilege = null)
	{

		// Wenn die Rolle nicht existiert, dann muss sie angelegt werden
		if (!empty($role) &amp;&amp; !$this-&gt;hasRole($role)) {
			$roleObj = new Zend_Acl_Role($role);
			$this-&gt;addRole($roleObj);
			$this-&gt;deny($role);
		}

		// Wenn eine Resource nicht existiert, dann muss sie angelegt werden
		if (!empty($resource) &amp;&amp; !$this-&gt;has($resource)) {
			$resObj = new Zend_Acl_Resource($resource);
			$this-&gt;add($resObj);
			$this-&gt;deny($role, $resource);
		}

		// Gehe nun an die Parent-Funktionalität für die normale Funktionalität
		return parent::isAllowed($role, $resource, $privilege);
	}
}</pre>
<p>Zuletzt sollte ich euch natürlich noch die Resource geben. Diese ist etwas umfangreicher und umfasst knapp 200 Zeilen. Her wird die gesamte Konfiguration verarbeitet und setzt in die Registry die Acl ein mit dem Key &#8220;Suka_Acl&#8221;, so dass die Acl in der gesamten Konfiguration aufzurufen ist. Ich persönlich habe das für ein Plugin zur Authorisation genutzt. Hier wird die Zugriffsberechtigung gleich geprüft.</p>
<pre class="brush: php">class Suka_Application_Resource_Acl extends Zend_Application_Resource_ResourceAbstract {

	/**
	 * Die ACL KOnfiguration
	 *
	 * @var array
	 */
	protected $_config;

	/**
	 * Die definierte ACL
	 *
	 * @var Suka_Acl
	 */
	protected $_acl;

	/**
	 * Der Basisstatus der ACL
	 * true 	= alles erlaubt
	 * false 	= alles verboten
	 *
	 * @var boolean
	 */
	protected $_baseState = false;

	/**
	 * Zentrale Verwaltung der ACL Resource
	 *
	 * @return void
	 */
	public function init()
	{
		// Prüft die Existenz
		if (!isset($this-&gt;_options[&#039;active&#039;])) {
			$this-&gt;_options[&#039;active&#039;] = false;
		}

		// Prüft, ob die ACL greifen soll
		if (is_bool($this-&gt;_options[&#039;active&#039;]) &amp;&amp; $this-&gt;_options[&#039;active&#039;] === false) {
			return;
		}

		// Die Konfiguration der ACL einlesen, wenn sie existiert, ansonsten Abbruch
		if (isset($this-&gt;_options[&#039;config&#039;]) &amp;&amp; is_file($this-&gt;_options[&#039;config&#039;])) {
			$this-&gt;_config = new Zend_Config_Ini($this-&gt;_options[&#039;config&#039;]);
		} else {
			return;
		}	

		// Die Acl definieren
		$this-&gt;_acl = new Suka_Acl();

		// Standard der ACL setzen
		if (!isset($this-&gt;_options[&#039;base&#039;])) {
			// Alles verbieten
			$this-&gt;_acl-&gt;deny();
			$this-&gt;_baseState = false;
		} else {
			if ($this-&gt;_options[&#039;base&#039;] == &#039;allow&#039;) {
				// Alles erlauben
				$this-&gt;_acl-&gt;allow();
				$this-&gt;_baseState = true;
			} elseif ($this-&gt;_options[&#039;base&#039;] == &#039;deny&#039;) {
				// Alles verbieten
				$this-&gt;_acl-&gt;deny();
				$this-&gt;_baseState = false;
			} else {
				// Alles verbieten
				$this-&gt;_acl-&gt;deny();
				$this-&gt;_baseState = false;
			}
		}

		// Rollen einlesen samt ihrer Resourcen
		$this-&gt;_createAclData();

		// Berechtigungen setzen
		$this-&gt;_setPermissions();

		// Zuletzt setze die ACL in die Registry
		Zend_Registry::set(&#039;Suka_Acl&#039;, $this-&gt;_acl);
	}

	/**
	 * Liest die Daten der ACL ein
	 *
	 * @var void
	 */
	protected function _createAclData()
	{
		// Wandel die Config in ein Array um
		$rolesArray = $this-&gt;_config-&gt;toArray();

		// Füge alle Variationen der ACL hinzu
		foreach ($rolesArray as $role =&gt; $ressources) {

			// Prüfe zuerst, ob die Rolle schon existiert
			if (!$this-&gt;_acl-&gt;hasRole($role)) {
				// Existiert nicht. Füge sie hinzu
				$roleObj = New Zend_Acl_Role($role);
				$this-&gt;_acl-&gt;addRole($roleObj);
			}

			// Prüfe, ob die Rolle Resourcen hat
			if (empty($ressources)) {
				continue;
			} 		

			// Lade die Ressourcen
			foreach ($ressources as $resource =&gt; $actions) {
				// Prüfe, ob die Ressource schon existiert
				if (!$this-&gt;_acl-&gt;has($resource)) {
					// Existiert nicht. Füge sie hinzu
					$resObj = new Zend_Acl_Resource($resource);
					$this-&gt;_acl-&gt;addResource($resObj);
				}
			}
		}
	}

	/**
	 * Setzt die Berechtigungen der ACL
	 *
	 * @return void
	 */
	protected function _setPermissions()
	{
		// Wandel die Config in ein Array um
		$rolesArray = $this-&gt;_config-&gt;toArray();

		// 

		// Gehe die Daten durch um die Berechtigungen zu setzen
		foreach ($rolesArray as $role =&gt; $ressources) {

			// Prüfe, ob es überhaupt Ressourcen gibt
			if (empty($ressources)) {
				continue;
			}

			// Wenn eine Wildcard erstellt wurde, dann gib alle Ressourcen frei
			if (isset($ressources[&#039;*&#039;])) {
				$this-&gt;_setAllowedOrDenied($role);
				continue;
			}

			// Gehe die Resourcen der Rolle durch
			foreach ($ressources as $ressource =&gt; $actions) {

				// Gehe die Actions durch und nutze den status
				foreach ($actions as $action =&gt; $state) {
					// Prüfe, ob die Ressource auch Actions hat
					if ($action == &#039;*&#039;) {
						// Hat keine Actions, alles freigeben
						$action = null;
					}

					// Prüfe, ob Erlaubt oder Verboten werden soll
					if ($state == &#039;allow&#039;) {
						$state = true;
					} else {
						$state = false;
					}

					// Setze die Berechtigung
					$this-&gt;_setAllowedOrDenied($role, $ressource, $action, $state);
				}
			}

		}
	}

	/**
	 * Setzt je nach Basisstatus eine Erlaubnis oder ein Verbot
	 *
	 * @param 	Zend_Acl_Role_Interface|string|array 		$roles
	 * @param 	Zend_Acl_Resource_Interface|string|array 	$resources
	 * @param 	string|array 								$privileges
	 * @return 	void
	 */
	protected function _setAllowedOrDenied($roles = null, $resources = null, $privileges = null, $allow = null)
	{
		// Setze das Allow und Deny zu einer Struktur
		if ($allow == false) {
			$this-&gt;_acl-&gt;deny($roles, $resources, $privileges);
		} else {
			$this-&gt;_acl-&gt;allow($roles, $resources, $privileges);
		}
	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.zorta.de/frameworks/zend-framework/zend-acl-mit-ini-konfiguration-und-resourcen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

