turk porno porno escort rokettube
Ergebnis 1 bis 2 von 2

Thema: Merkwürdiges Verhalten nach Änderung an ACL

  1. #1
    Benutzer
    Registriert seit
    13.11.2008
    Beiträge
    32
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard Merkwürdiges Verhalten nach Änderung an ACL

    Hallo,

    ich weiß der Titel ist jetzt etwas nichtssagend, aber im Moment bin ich mir selber nicht sicher was da nicht richtig läuft.
    Ich hab in meiner Probieranwendung die Auth/Acl-Geschichte etwas umgebaut.
    Bisher hatte ich ein Controller-Plugin das alles erledigt hat:
    PHP-Code:
    <?php
    class CMS_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract
    {
        public function 
    dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
        {
            
    // set up acl
            
    $acl = new Zend_Acl();
            
            
    // add the roles
            
    $acl->addRole(new Zend_Acl_Role('guest'));
            
    $acl->addRole(new Zend_Acl_Role('user'), 'guest');
            
    $acl->addRole(new Zend_Acl_Role('admin'), 'user');
            
            
    // add the resources
            
    $acl->add(new Zend_Acl_Resource('index'));
            
    $acl->add(new Zend_Acl_Resource('error'));
            
    $acl->add(new Zend_Acl_Resource('page'));
            
    $acl->add(new Zend_Acl_Resource('menu'));
            
    $acl->add(new Zend_Acl_Resource('menuitem'));
            
    $acl->add(new Zend_Acl_Resource('user'));
            
    $acl->add(new Zend_Acl_resource('bug'));
            
    $acl->add(new Zend_Acl_Resource('search'));
            
    $acl->add(new Zend_Acl_Resource('feed'));

            
    // set up the access rules
            
    $acl->allow(null, array('index''error'));

            
    // a guest can only read content and login
            
    $acl->allow('guest''page', array('index''open'));
            
    $acl->allow('guest''menu', array('render'));
            
    $acl->allow('guest''user', array('login','register''justregistered','activate''validateform'));
            
    $acl->allow('guest''search', array('index''search'));
            
    $acl->allow('guest''feed');
            
    $acl->allow('guest''error');

            
    // cms users can also work with content
            
    $acl->allow('user''page', array('list''create''edit''delete'));
            
    $acl->allow('user''user', array('logout''update''delete''password''profile'));
            
    $acl->allow('user''bug');
            
    // administrators can do anything
            
    $acl->allow('admin'null);
            
            
    // fetch the current user
            
    $auth Zend_Auth::getInstance();
            if(
    $auth->hasIdentity()) {
                
    $identity $auth->getIdentity();
                
    $role strtolower($identity->role);
            }else{
                
    $role 'guest';
            }
            
            
    $controller $request->controller;
            
    $action $request->action;
            
            if (!
    $acl->isAllowed($role$controller$action)) {
                if (
    $role == 'guest') {
                    
    $request->setControllerName('user');
                    
    $request->setActionName('login');
                } else {
                   
    $request->setControllerName('error');
                   
    $request->setActionName('noauth');
               }
            }       
            
        }    
    }
    und jetzt habe ich ein paar Sachen aufgeteilt und es sieht (statt dem obigen Plugin) so aus:
    Auth-Plugin
    PHP-Code:
    <?php
    class CMS_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract
    {
        public function 
    dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
        {
           
            
    // Lade aktuelle Rolle aus der Identität falls vorhaben
            
    $role Zend_Auth::getInstance()->hasIdentity() 
                  ? 
    Zend_Auth::getInstance()->getIdentity()->role 
                  
    'guest';
            
            
    // Hole ACL für Modul
            
    $acl CMS_Acl::getInstance($request->getModuleName());
            
            
    // Prüfe Rechte 
            
    if (!$acl->isAllowed($role$request->getControllerName(), $request->getActionName())) {
                if (
    $role == 'guest') {
                    
    $request->setControllerName('user');
                    
    $request->setActionName('login');
                } else {
                   
    $request->setControllerName('error');
                   
    $request->setActionName('noauth');
               }
            }          
            
        }    
    }
    Acl-Klasse
    PHP-Code:
    <?php
    /**
     * Acl Erweiterung
     *
     * @package    CMS
     */
    class CMS_Acl extends Zend_Acl 
    {
        
    /**
         * Singleton Instanzen
         *
         * @var array enthalten ACL Objekte
         */
        
    protected static $_instances = array();

        
    /**
         * Hole Instanz
         * 
         * @param string $module Name des Moduls 
         * @return CMS_Acl
         */
        
    public static function getInstance($module 'default')
        {
            
    // Falls Datei nicht existiert wechsel zu Default Modul
            
    if (!file_exists(APPLICATION_PATH.'/configs/acl/' $module '.ini')) {
                
    $module 'default';
            }        
            
    // Prüfe ob Instanz schon existiert und erstelle sie bei Bedarf
            
    if (!array_key_exists($moduleself::$_instances)) 
            {          
                
    self::$_instances[$module] = new CMS_Acl($module);
            }
            
            
    // Gebe Singleton Instanz zurück
            
    return self::$_instances[$module];
        }
        
        
    /**
         * Erstellt ACL mit Rollen, Ressourcen und Rechten
         * 
         * @param string $module Name des Moduls
         */
        
    protected function __construct($module 'default')
        {
            
    // Lade ACL Daten aus INI Datei
            
    $config = new Zend_Config_Ini(APPLICATION_PATH.'/configs/acl/' $module '.ini');
            
            
    // lege Rollen an
            
    foreach ($config->roles as $role) {
                
    $this->addRole(new Zend_Acl_Role($role));
                
            }
            
            
    // lege Ressourcen an
            
    foreach ($config->ressources as $resource) {
                
    $this->add(new Zend_Acl_Resource($resource));
                
            }
            
            
    // lege Regeln an
            
    foreach ($config->rules as $function => $rule) {        
                foreach (
    $rule as $role => $rule2) {            
                    foreach (
    $rule2 as $resource => $rule3) {                
                        if (
    'all' == $rule3) {
                            
    $this->$function($role$resource);
                            
    //Zend_Debug::dump($rule3);
                        
    } else {
                            
    $this->$function($role$resource$rule3->toArray());
                            
    //Zend_Debug::dump($rule3);
                        
    }
                    }
                }
            }
        }
    }
    und eine INI-Datei für Resourcen, Rollen und Privilegien
    Code:
    ; Definiere Rollen
    [roles]
    1 = guest
    2 = user
    3 = admin
    
    ; Definiere Ressourcen
    [ressources]
    1 = index
    2 = error
    3 = page
    4 = menu
    5 = menuitem
    6 = user
    7 = bug
    8 = search
    9 = feed
    
    ; Definiere Regeln und Privilegien
    [rules]
    allow.guest.index = all
    allow.guest.page.1 = index
    allow.guest.page.2 = open
    allow.guest.menu.1 = render
    allow.guest.user.1 = login
    allow.guest.user.2 = register
    allow.guest.user.3 = justregistered
    allow.guest.user.4 = activate
    allow.guest.user.5 = validateform
    allow.guest.search.1 = index
    allow.guest.search.2 = search
    allow.guest.feed = all
    allow.guest.error = all
    allow.user.page.1 = list
    allow.user.page.2 = create
    allow.user.page.3 = edit
    allow.user.page.4 = delete
    allow.user.user.1 = profile
    allow.user.user.2 = update
    allow.user.user.3 = logout
    allow.user.user.4 = password
    allow.user.user.5 = delete
    allow.user.bug = all
    In meiner application.ini hab ich dann noch die Zeile
    Code:
    resources.frontController.plugins.acl = "CMS_Controller_Plugin_Acl"
    in
    Code:
    resources.frontController.plugins.auth = "CMS_Controller_Plugin_Auth"
    geändert.
    Und seit diesen Änderungen, passieren beim Aufruf einiger Resourcen merkwürdige Sachen: http://ant-design.de/Zend-Spielwiese_dev.png

    Sieht irgendwie so aus als ob da etwas zweimal aufgerufen wird. Einmal ist die Anwendung der Meinung, dass die Seite nicht existiert und dann ist sie aber doch da. Und beides wird dann ineinander geschachtelt.
    Weitere Fehlermeldungen (außer der des ErrorControllers, das die Seite nicht gefunden wurde) gibt es nicht.
    Auffällig ist dass das Problem nur für die Rolle user auftritt. Alle Resourcen, die von der Rolle guest zugänglich sein sollen, verursachen das nicht.

    Hat jemand eine Idee was ich da falsch gemacht haben könnte? Irgendwie seh' ich's nicht.

    Danke!
    Geändert von shredder (05.03.2011 um 17:21 Uhr)

  2. #2
    Benutzer
    Registriert seit
    13.11.2008
    Beiträge
    32
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Hm, ich habe mal am Ende des Auth-Plugins nach dem Prüfen der Rechte ein Zend_Debug::dump($acl); eingefügt.
    Bei allen Resourcen bei denen es vernünftig funktioniert wird brav das Acl-Objekt ausgegeben, wenn aber der Fehler mit dem doppelten Layout auftritt dann wird hier gar nichts ausgegeben.
    Also wird unter bestimmten Umständen gar kein Acl-Objekt gebildet.
    Sehr kurios.

    P.S. Haha ... manchmal sind es echt die kleinen Dinge.
    Ich hab den Fehler gefunden.
    In meinem "alten" Acl-Plugin stand bei der Authentifizierung unter anderem folgendes:
    PHP-Code:
            $auth Zend_Auth::getInstance();
            if(
    $auth->hasIdentity()) {
                
    $identity $auth->getIdentity();
                
    $role strtolower($identity->role);
            }else{
                
    $role 'guest';
            } 
    das ich in meinem Auth-Plugin auf folgendes "eingekürzt" hab
    PHP-Code:
            $role Zend_Auth::getInstance()->hasIdentity() 
                  ? 
    Zend_Auth::getInstance()->getIdentity()->role 
                  
    'guest'
    Eigentlich alles kein Problem, wenn ich nicht mal ganz am Anfang die "glorreiche" Idee gehabt hätte die Rollen in der DB mit großem Anfangsbuchstaben abzuspeichern. Und Bums kommt die Anwendung damit nicht mehr klar, weil ja das $role = strtolower($identity->role); im neuen Plugin fehlt.

    Oh Mann, das war ja mal ein harter Brocken wegen kleiner Ursache.

    Fein, dann kann ich ja wieder ruhig schlafen.

    P.P.S. Hm, auch wenn jetzt wieder alles so funktioniert wie es soll, kann mir mal jemand erklären, wie genau dieses merkwürdige Verhalten zustandekommt? Die Anwendung findet die Nutzerrolle user nicht und rendert deshalb das Layout doppelt und dann noch ineinander verschachtelt?
    Ich kann da irgendwie nicht so recht den Ablauf nachvollziehen.
    Geändert von shredder (07.03.2011 um 12:38 Uhr)

Ähnliche Themen

  1. Antworten: 17
    Letzter Beitrag: 24.09.2012, 17:56
  2. Zend CSS Änderung wird nicht wirksam
    Von 1234d1 im Forum Einsteigerfragen
    Antworten: 2
    Letzter Beitrag: 01.09.2010, 16:49
  3. Zend_Date Änderung bei der Array Notation mit ZF 1.8
    Von Pwner im Forum Lokalisierung & Internationalisierung
    Antworten: 4
    Letzter Beitrag: 30.06.2009, 11:15
  4. Merkwürdiges Zend_Date Verhalten
    Von Octavian im Forum Lokalisierung & Internationalisierung
    Antworten: 5
    Letzter Beitrag: 14.11.2008, 15:58
  5. Antworten: 0
    Letzter Beitrag: 10.01.2008, 17:11

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •