php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.07.2011, 00:01  
Erfahrener Benutzer
 
Benutzerbild von dreamcatcher
 
Registriert seit: 28.12.2010
Beiträge: 603
PHP-Kenntnisse:
Anfänger
dreamcatcher wird schon bald berühmt werden
Standard [Erledigt] Zend Framework - Roles dynamisch erstellen (Zend ACL)

Die wohl größte Herausforderung in meinem jetzigen Projekt besteht darin, dem Endbenutzer eine variable Rollenerstellung zu ermöglichen.

Der Admin erstellt z.B. die Role "Author" neu und weißt ihr z.B. die Berechtigung "Darf Seite foo sehen und vollständig benutzen" hinzu.

Die Herausforderung besteht darin, die fest definierten Rollen/Privileges um die neu erstellte Rolle ggf. anzupassen.

Um das genauer zu definieren hier einmal mein derzeitiger Stand:

navigation.xml
PHP-Code:
[...]
<
home>
  <
label>Home</label>
  <
module>default</module>
  <
controller>index</controller>
  <
action>index</action>
  <
resource>default:index</resource>
  <
privilege>index</privilege>
  <
pages>
      [...]
  </
pages>
</
home>
[...] 
default/models/libraryACL.php
PHP-Code:
[...]
/**
* Roles
*/
$this->addRole(new Zend_Acl_Role('guests'))
$this->addRole(new Zend_Acl_Role('users''guests'))
$this->addRole(new Zend_Acl_Role('admins''users'))

/**
* Resources
*/
$this->add(new Zend_Acl_Resource('default'))
       ->
add(new Zend_Acl_resource('default:index'), 'default')
       ->
add(new Zend_Acl_resource('default:error'), 'default')

[...]

/**
* Privileges/Permissions
* Role | Resource | Privilege
* allow/deny (Role, module:controller, action)
*/
$this->allow('guests''default:error''error')

$this->allow('users''default:index''index')
[...] 
Und die Rechte des Users an sich sind natürlich in der DB gespeichert.

Nun ist meine Frage:
Wie löst man die Herausforderung dem User zu erlauben dynamisch Rollen anzulegen mit Permissions ?

Die Permissions in die Datenbank zu bekommen ist kein Problem, die Rolle an sich ist ebenfalls leicht in der DB gespeichert, nur:

a.) Komme ich nicht drum herum die gesamte libraryACL.php in die DB auszulagern ?
Wie wird sonst an solch eine Herausforderung herangegangen ?

Das Einzige was mir auf anhieb einfällt ist, dass ich die Rollen in einem Table speicher und dann per foreach() unter

/**
* Roles
*/

registriere bzw. bekannt mache.

Das Gleiche gilt auch für die Permissions, welche ich mir ebenfalls so aus der DB ziehen würde und per foreach() die Befehle bauen würde.

Die Resourcen bleiben unverändert.



Das ganze Vorgehen kommt mir etwas "zusammengebastelt" vor, daher meine nächste Frage:

b.) Ist das Vorgehen sinnvoll ?
und
c.) Welche anderen Methoden gibt es um dies umzusetzen ?

Ich denke vor allem eher an eine Methode o.Ä. welcher ich nur noch als Array z.B. die gewissen Werte übergeben muss
und nicht Zeile für Zeile das einzeln wieder zusammenbauen aus der Datenbank.

Das ist mein Gedankengang.

EOF
__________________________________________________ __________________________________________________

Update1:
In der Doc habe ich ein Kommentar gefunden welchen quasi meine gedachte Methode per foreach() in etwas sauberer Form darstellt.

PHP-Code:
<?php

require_once('Zend/Acl.php');

/* acl related tables

  CREATE TABLE `acl_roles` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `parent_id` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
  );

  CREATE TABLE `acl_resources` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `parent_id` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
  );

  CREATE TABLE `acl_roles_resources` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `acl_role_id` int(10) unsigned NOT NULL,
  `acl_resource_id` int(10) unsigned NOT NULL,
  `privilege` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_role_res_priv` (`acl_role_id`,`acl_resource_id`,`privilege`)
  );

 */

class MyAcl {

    private 
$acl null;

    function 
__construct() {
        
$this->acl = new Zend_Acl();
        
$this->_initRoles();
        
$this->_initResources();
        
$this->_initPrivileges();
    }

    function 
isAllowed($some_role$some_resource$some_privilege) {
        return 
$this->acl->isAllowed($some_user$some_resource$some_action);
    }

    private function 
_initRoles() {
        
$roles AclRole::all();
        foreach (
$roles as $role) {
            if (
$role->parent) {
                
$parent $this->acl->getRole($role->parent->name);
                if (
is_null($parent)) {
                    
// if parent hasn't been created in memory, do so
                    
$parent = new Zend_Acl_Role($role->parent->name);
                    
$this->acl->addRole($parent);
                }
                
$this->acl->addRole(new Zend_Acl_Role($role->name), $parent);
            } else {
                
// only needs to be done if it doesn't exist
                
if (!$this->acl->hasRole($role->name)) {
                    
$this->acl->addRole(new Zend_Acl_Role($role->name));
                }
            }
        }
    }

    private function 
_initResources() {
        
$resources AclResource::all();
        foreach (
$resources as $resource) {
            if (
$resource->parent) {
                
$parent $this->acl->get($resource->parent->name);
                if (
is_null($parent)) {
                    
$parent = new Zend_Acl_Resource($resource->parent->name);
                    
$this->acl->addResource($parent);
                }
                
$this->acl->addResource(new Zend_Acl_Resource($resource->name), $parent);
            } else {
                if (!
$this->acl->has($resource->name)) {
                    
$this->acl->addResource(new Zend_Acl_Resource($resource->name));
                }
            }
        }
    }

    private function 
_initPrivileges() {
        
$privileges AclRolesResource::all();
        foreach (
$privileges as $privilege) {
            
// make sure role and resource are valid
            
if ($privilege->acl_role && $privilege->acl_resource) {
                
$this->acl->allow($privilege->acl_role->name$privilege->acl_resource->name$privilege->privilege);
            } else {
                echo 
'WARNING: unable to create privilege';
            }
        }
    }

}
?>
Quelle:
http://framework.zend.com/manual/en/....advanced.html


Sehe ich es richtig, dass nur die Zeilen:

PHP-Code:
        $roles AclRole::all();
        
$resources AclResource::all();
        
$privileges AclRolesResource::all(); 
durch entsprechende "Lade aus der DB als Array" Zeilen ersetzt werden müssen ?

Ich würde somit einfach 3 x DBTable Models anlegen und dann in der MyACL Klasse per $fooDBTable->fetchAll() per Array alles reinladen.
Wie findet ihr diese Lösung & gibt es eine bessere ?

Geändert von dreamcatcher (24.07.2011 um 02:59 Uhr).
dreamcatcher ist gerade online   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.07.2011, 03:09  
Erfahrener Benutzer
 
Registriert seit: 11.04.2011
Beiträge: 260
PHP-Kenntnisse:
Fortgeschritten
lcrash wird schon bald berühmt werden
Standard

Nein du wirst die Rolen in die Datenbank speichern müssen. Nichts spricht dabei entgegen diese Rolen auch in eine Config zu speichern (Zend_Config_Writer).

Einzig deine statischen Methoden finde ich seltsam. Wie kommt es dazu?
lcrash ist offline   Mit Zitat antworten
Alt 24.07.2011, 13:07  
Erfahrener Benutzer
 
Benutzerbild von dreamcatcher
 
Registriert seit: 28.12.2010
Beiträge: 603
PHP-Kenntnisse:
Anfänger
dreamcatcher wird schon bald berühmt werden
Standard

Mit statischen Methoden meinst du die 3 Singletons ?

PHP-Code:
  $roles AclRole::all();
        
$resources AclResource::all();
        
$privileges AclRolesResource::all(); 
Das wusste ich auch nicht & war ebenfalls meine Frage.
Der Quellcode ist als Beispiel 1:1 kopiert & formatiert aus dem Kommentar eines Users in der ZF Doc.

Ich gehe davon aus, dass die 3 Singletons als Platzhalter dienen für die "hole die Daten aus der DB" Methoden.

Oder meinst du eine andere Methode und ich steh auf dem Schlauch ?
dreamcatcher ist gerade online   Mit Zitat antworten
Alt 24.07.2011, 17:55  
Erfahrener Benutzer
 
Registriert seit: 11.04.2011
Beiträge: 260
PHP-Kenntnisse:
Fortgeschritten
lcrash wird schon bald berühmt werden
Standard

Singletons um Daten aus einer Datenbank zu holen? Warum dafür nicht einfach neue Instanzen von den entsprechenden Models?
lcrash ist offline   Mit Zitat antworten
Alt 24.07.2011, 18:55  
Erfahrener Benutzer
 
Benutzerbild von dreamcatcher
 
Registriert seit: 28.12.2010
Beiträge: 603
PHP-Kenntnisse:
Anfänger
dreamcatcher wird schon bald berühmt werden
Standard

Das hab ich mich auch gefragt als ich das Kommentar aus der Doc hier rüber kopiert habe

Wahrscheinlich um schnell deutlich zu machen, dass es sich um Platzhalter handelt, welche selbst editiert werden müssen.

Wie gesagt, der Quellcode der letzten Datei ist nicht von mir sondern aus einem Kommentar der Doc (Siehe Quellenverweis oben).
dreamcatcher ist gerade online   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zend Framework Videotutorial Reihe dreamcatcher Off-Topic Diskussionen 10 24.07.2011 12:47
MVC im Zend Framework elf PHP Einsteiger 23 24.05.2011 11:44
Buchempfehlung Zend Framework Leichti PHP-Fortgeschrittene 1 12.05.2011 09:19
Rightmanagement mit ZEND Framework dreamcatcher Software-Design 8 15.04.2011 09:18
Zend Framework Schulung abdullah Beruflich 2 16.01.2011 13:00
[Erledigt] Mysql - Query dynamisch erstellen - String zusammenfügen zoom PHP Tipps 2010 12 19.10.2010 13:50
Webentwickler (PHP, Zend Framework, Ruby on Rails) sucht neue Projekte tbuehl Beruflich 0 04.10.2010 15:18
Zend Webinare robo47 Off-Topic Diskussionen 0 16.03.2010 10:02
[Erledigt] Zend Framework Installation : Error 500 Puccini PHP Tipps 2010 2 10.02.2010 08:22
[S] Zend Framework Coder ThisRockZ Beitragsarchiv 0 14.10.2009 13:14
Kohana Framework / CakePHP / Zend ramses PHP-Fortgeschrittene 6 29.09.2009 01:38
Dynamisch Ordner erstellen und Dynamisch Bilderordner auslesen timmeyy PHP Tipps 2009 9 22.06.2009 09:13
Suche Schüler o.ä. mit Zend Framework Erfahrung -> 200 Euro mrmojo Beitragsarchiv 3 10.01.2009 15:38
Zend Studio for Eclipse und Zend Framework KeKs0r PHP-Fortgeschrittene 5 15.12.2008 15:10
Zend Framework Melchior PHP-Fortgeschrittene 29 13.03.2008 21:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
zend acl database, zend acl, zend acl db, zend acl datenbank, zend_acl dynamisch, dynamische rechteverwaltung zend acl, zend framework navigation acl, zend framework acl role datenbank tutorial, zend framework dynamische acl 2011, zend framework acl datenbank, zend acl database role resource, zend framework dynamische acl, \$this->_acl->add(new, aclrole::all(), php acl model, zend framework add roles, php roles, zend acl role, zend acl recht für einen user, zend framework zend acl

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:01 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum