
Öffentliche Methoden | |
| getObject () | |
| Instanziiert Klasse und gibt Objekt zurück. | |
Öffentliche Attribute | |
| const | ACL_RESOURCES_DIR = 'modules/meta/acl/resources/' |
| string, Verzeichnis der XML-Dateien für die ACL-Ressourcen | |
Definiert in Zeile 9 der Datei Acl.php.
| Dsao_Constructor_Acl::getObject | ( | ) |
Instanziiert Klasse und gibt Objekt zurück.
| $parameters | array, Parameter für Konstruktion |
Implementiert Dsao_Constructor_Interface.
Definiert in Zeile 17 der Datei Acl.php.
Benutzt Dsao_Module_Broker::getInstance() und Dsao_Registry::getTable().
00018 { 00019 $acl = new Zend_Acl(); 00020 00021 // Alle Rollen laden 00022 $rolesRowset = Dsao_Registry::getTable('acl_role')->fetchAll(); 00023 00024 // Hier werden die Rollen mit ihrer ID als Index gespeichert 00025 $rolesArray = array(); 00026 00027 // Array mit Rollen erstellen 00028 foreach ($rolesRowset as $roleRow) 00029 { 00030 $rolesArray[$roleRow->id]['object'] = new Zend_Acl_Role($roleRow->name); 00031 $rolesArray[$roleRow->id]['parents'] = $roleRow->parents; 00032 } 00033 00034 // Rollen dem ACL-Objekt hinzufügen 00035 foreach ($rolesArray as $role) 00036 { 00037 // Beerbte Rollen 00038 $parents = array(); 00039 00040 // IDs durchgehen und Referenz auf jeweilige Rolle in Array speichern 00041 foreach (explode(',', $role['parents']) as $roleId) 00042 { 00043 // Falls Rolle vorhanden 00044 if (isset($rolesArray[$roleId])) 00045 { 00046 $parents[] = $rolesArray[$roleId]['object']; 00047 } 00048 } 00049 00050 $acl->addRole($role['object'], $parents); 00051 } 00052 00053 // Nun die Ressourcen 00054 00055 // XML-Loader für das ACL-Ressourcen-Verzeichnis erstellen 00056 $xmlLoaderResources = 00057 new Dsao_Xml_Loader(XML_DIR.self::ACL_RESOURCES_DIR, 00058 // Liste der aktiven Module 00059 Dsao_Module_Broker::getInstance()->getModulesActive(true)); 00060 00061 // Befugnisse für die einzelnen Rollen 00062 $permissions = array(); 00063 00064 // Array für die Ressourcen mit ihrem Namen als Index 00065 $resourcesArray = array(); 00066 00067 // Objekte der Dateien durcgehen 00068 foreach ($xmlLoaderResources->getXmlObjects() as $xml) 00069 { 00070 // Ressourcen durcgehen 00071 foreach ($xml->children() as $child) 00072 { 00073 // Ressource erstellen 00074 $resourcesArray[(string) $child->id] = 00075 new Zend_Acl_Resource($child->id); 00076 00081 // Index für Schleife 00082 $indexPermission = 'allowed'; 00083 00084 // SimpleXML-Bug Workaround 00085 $childArray = (array) $child; 00086 00087 // Arrays mit IDs der Rollen 00088 $rolesAllowed = (isset($childArray['allow']) ? 00089 (array) $childArray['allow'] : array()); 00090 $rolesDenied = (isset($childArray['deny']) ? 00091 (array) $childArray['deny'] : array());; 00092 00093 // Trennelement einfügen 00094 array_push($rolesAllowed, null); 00095 00096 // Erlaubnisse und Verbote durchgehen 00097 foreach (array_merge($rolesAllowed, $rolesDenied) as $roleId) 00098 { 00099 // Ggf. Index umstellen 00100 if (null === $roleId) 00101 { 00102 $indexPermission = 'denied'; 00103 } 00104 00105 // explode produziert mindestens ein leeres Element, überspringen 00106 if (!is_numeric($roleId)) 00107 { 00108 continue; 00109 } 00110 00111 $permissions[$roleId][$indexPermission][] = 00112 $resourcesArray[(string) $child->id]; 00113 } 00114 00115 } 00116 } 00117 00118 // Nun zum ACL-Objekt hinzufügen 00119 foreach ($resourcesArray as $resource) 00120 { 00121 // Elternressource, sofern vorhanden 00122 $parent = null; 00123 00124 // Falls Unterstrich in Ressourcenname gefunden wurde 00125 if (false !== 00126 ($lastUnderscorePosition = strrpos($resource->getResourceId(), '_'))) 00127 { 00128 // Elternressource 00129 $parent = substr($resource->getResourceId(), 00130 // Am Anfang starten 00131 0, 00132 // die Länge entspricht der Position des letzten Unterstrichts 00133 $lastUnderscorePosition); 00134 00135 // Falls Ressource vorhanden 00136 if (isset($resourcesArray[$parent])) 00137 { 00138 $parent = $resourcesArray[$parent]; 00139 } 00140 } 00141 00142 $acl->add($resource, $parent); 00143 } 00144 00145 // Nun noch einmal Rollen durchgehen und Befugnisse hinzufügen 00146 foreach ($rolesArray as $roleId => $role) 00147 { 00148 // Erlaubte Ressourcen 00149 $allowed = ( isset($permissions[$roleId]['allowed']) ? 00150 $permissions[$roleId]['allowed'] : null); 00151 00152 // Falls Ressourcen erlaubt sind, oder Benutzer Admin 00153 if (null !== $allowed || 1 == $roleId) 00154 { 00155 $acl->allow($role['object'], $allowed); 00156 } 00157 00158 // Falls nicht erlaubte Ressourcen vorhanden sind 00159 if (isset($permissions[$roleId]['denied'])) 00160 { 00161 $acl->deny($role['object'], $permissions[$roleId]['denied']); 00162 } 00163 } 00164 00165 // Der Rolle mit der ID 1 ist immer alles erlaubt 00166 $acl->allow($rolesArray[1]['object']); 00167 00168 return $acl; 00169 }
1.5.7.1