2016-10-15 4 views
0

Может ли кто-нибудь помочь мне разобраться с сделкой с Cakephp 3.3 и проблемой BeforeFilter/Auth Redirect, с которой я столкнулся.CakePHP3 BeforeFilter & Auth Redirect

Я использую компонент Auth по умолчанию. Я создал настраиваемый компонент, который дополнительно проверяет переменную сеанса (Registration), и если эта переменная не задана, перенаправляется на страницу, предназначенную для выбора, чтобы установить желаемую регистрацию.

Вот мой пользовательский компонент:

<?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')); 
} 

} 

Не все диспетчерские требует переменных регистраций необходимо установить, поэтому я решил пойти с компонентом подходом. Компонент однако загружен в AppController по этой линии:

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

В контроллерах, которые требуют регистрации переменной для установки, я включаю следующую функцию beforeFilter:

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

Теперь я что некоторые интеграционные тесты определены, вот один из них:

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

Итак, после того, как я реализовал свой RegistrationCheck компонент, я побежал Интеграционные тесты. Я ожидал, что тест пройдет, это не так. Интересно то, что он фактически вернул перенаправление на Users-> registrations, а не на Users-> login, как я и ожидал.

Мне кажется, что перенаправление RegistrationCheck происходит до перенаправления компонента Auth. Я не уверен, что это огромная сделка, потому что переадресация на регистрацию без набора Auth приведет к перенаправлению обратно на логин, но кажется неправильным игнорировать его ... также я просто хотел бы немного понять о том, что происходит на самом деле.

Может ли кто-нибудь предложить изменения в моем коде, которые гарантировали бы, что компонент Auth обрабатывается до компонента RegistrationCheck?

Заранее спасибо.

ответ

0

Ну, после того, как немного больше исследований, я нашел ответ я ищу здесь: http://book.cakephp.org/3.0/en/controllers/components/authentication.html#deciding-when-to-run-authentication

Довольно просто на самом деле, просто хотел, чтобы включить ответ здесь для тех, кто может наткнуться на тот же вопрос.

 Смежные вопросы

  • Нет связанных вопросов^_^