2016-10-15 6 views
0

Kann mir jemand helfen, den Deal mit CakePHP 3.3 und einem Problem mit BeforeFilter/Auth Redirect zu verstehen.CakePHP3 BeforeFilter & Auth Redirect

Ich verwende die Standard-Auth-Komponente. Ich habe eine benutzerdefinierte Komponente erstellt, die zusätzlich nach einer Sitzungsvariablen (Registrierung) sucht. Wenn diese Variable nicht festgelegt ist, wird auf eine Seite umgeleitet, die eine Auswahl zum Festlegen der gewünschten Registrierung vornehmen soll.

Hier ist meine eigene Komponente:

<?php 

namespace App\Controller\Component; 

use Cake\Controller\Component; 
use Cake\Network\Request; 


class RegistrationCheckComponent extends Component 
{ 

private $_allowedActions = []; 
private $_superUserBypass = false; 

public $components = ['Auth']; 

public function superUserBypass($val = false) { 
    $this->_superUserBypass = $val; 
} 

public function allow(Array $allowedActions = []) { 
    $this->_allowedActions = $allowedActions; 
} 

public function verify() { 

    if($this->_superUserBypass) { 
     return true; 
    } 

    $session = $this->request->session(); 
    //if Auth Registration is not set 
    if(!$session->read('Auth.Registration')) { 
     //if requested action is not in the array of allowed actions, redirect to select registration 
     if(!in_array($this->request->param('action'), $this->_allowedActions)) { 
      return $this->redirect(); 
     }; 
     return true; 
    } 
    return true; 

} 

public function redirect() { 
    $controller = $this->_registry->getController(); 
    return $controller->redirect($this->config('redirect')); 
} 

} 

Nicht alle Controller die Registrierung Variable erfordern eingestellt werden, das ist, warum ich mit dem Komponentenansatz beschlossen zu gehen. Die Komponente wird jedoch in den AppController durch diese Zeile geladen:

$this->loadComponent('RegistrationCheck', ['redirect' => ['controller' => 'Users', 'action' => 'registrations']]); 

In den Controllern, die die Registrierung Variable erfordern eingestellt wird, schließe ich die folgende Funktion before:

public function beforeFilter(Event $event) { 
    parent::beforeFilter($event); 
    return $this->RegistrationCheck->verify(); 
} 

Nun, ich habe einige Integrationstests definiert hatte, hier ist einer von ihnen:

public function testUnauthenticatedEdit() 
{ 
    $this->get('/teams/edit'); 
    $this->assertRedirect(['controller' => 'Users', 'action' => 'login']); 
} 

So, nachdem ich meine RegistrationCheck Komponente implementiert, ich die Integrationstests lief. Ich habe erwartet, dass der Test bestanden wird, aber nicht. Das Interessante ist, dass es tatsächlich eine Umleitung zu Benutzer-> Registrierungen statt Benutzer-> Anmeldung wie erwartet zurückgeschickt hat.

Es sieht für mich aus, dass die RegistrationCheck-Umleitung vor der Umleitung der Auth-Komponente stattfindet. Ich bin mir nicht sicher, dass es eine große Sache ist, denn eine Weiterleitung an Registrierungen ohne Auth-Set wird am Ende wieder zum Login führen, aber es scheint falsch, es zu ignorieren ... außerdem würde ich gerne ein bisschen mehr verstehen von dem, was tatsächlich vor sich geht.

Kann jemand Änderungen an meinem Code vorschlagen, der sicherstellen würde, dass die Auth-Komponente vor der RegistrationCheck-Komponente behandelt wird?

Vielen Dank im Voraus.

Antwort

Verwandte Themen