CakePHP自动重定向管理员404到登录

CakePHP自动重定向管理员404到登录,cakephp,cakephp-2.3,Cakephp,Cakephp 2.3,我使用Auth组件和ACL授予角色权限,如果角色没有适当的权限,则将其重定向到/login 这适用于所有现有控制器/操作。但每当我输入一个不存在的控制器动作http://www.mypage.de/fake/bla我得到了一个NotFoundException 我的问题是,用户看到了我的管理布局,因为404是在管理布局模板中呈现的 有没有办法说admin(或任何前缀)总是受到限制,而未登录的用户会被重定向到登录页面? 我想到的是这个,但我不喜欢它,因为我必须对所有其他前缀做同样的操作 /**

我使用Auth组件和ACL授予角色权限,如果角色没有适当的权限,则将其重定向到/login

这适用于所有现有控制器/操作。但每当我输入一个不存在的控制器动作
http://www.mypage.de/fake/bla
我得到了一个NotFoundException

我的问题是,用户看到了我的管理布局,因为404是在管理布局模板中呈现的

有没有办法说admin(或任何前缀)总是受到限制,而未登录的用户会被重定向到登录页面?

我想到的是这个,但我不喜欢它,因为我必须对所有其他前缀做同样的操作

/**
 * AppController::afterFilter()
 *
 * @return void
 */
function afterFilter() {
    if ($this->response->statusCode() === 404 && !empty($this->request->params['admin'])) {
        $url = Router::url(
            array(
                'admin' => false,
                'plugin' => false,
                'controller' => 'users',
                'action' => 'login'
            )
        );
        $this->Common->flashMessage(__('You are not authorized to access that location.'), 'error');
        return $this->redirect($url);
    }
}

您的代码实际上做得很好,但除了在
foreach
循环中执行之外,没有办法自动为每个前缀执行此操作:

function afterFilter() {
    if($this->response->statusCode() === 404) {
        foreach(array('admin', 'otherprefix') as $prefix) {
            if(!empty($this->request->params[$prefix])) {
                [...]
            }
        }
    }
}
如果您想对所有404错误一视同仁——不管可能的前缀是什么——您只需更改404错误的布局即可:

function afterFilter() {
    if($this->response->statusCode() === 404) {
        $this->layout = 'default';
    }
}
这样,没有人会在任何404页面上看到管理员布局