任何人都可以帮助我理解与Cakephp 3.3的交易以及我遇到的BeforeFilter / Auth Redirect问题。
我使用默认的Auth组件。我创建了一个自定义组件,它还检查会话变量(注册),如果未设置该变量,则重定向到设计用于设置所需注册的页面。
这是我的自定义组件:
<?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']]);
在需要设置Registration变量的控制器中,我包括以下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组件之后,我运行了集成测试。我期待测试通过,但事实并非如此。有趣的是,它实际上返回了一个重定向到用户 - &gt;注册,而不是像我预期的那样返回用户 - >登录。
在我看来,在Auth组件重定向之前发生了RegistrationCheck重定向。我不确定这是一笔巨大的交易,因为重定向到没有Auth设置的注册将最终重定向回登录,但忽略它似乎是不正确的......我也是只是想了解更多实际情况。
有人可以建议更改我的代码,以确保在RegistrationCheck组件之前处理Auth组件吗?
提前致谢。
答案 0 :(得分:0)
嗯,经过一番研究后,我找到了我在这里寻找的答案:http://book.cakephp.org/3.0/en/controllers/components/authentication.html#deciding-when-to-run-authentication
非常简单,只是想在这里为可能遇到同一问题的人提供一个答案。