我正在使用Auth组件和ACL为角色授予权限,如果他们没有适当的权限,则将其重定向到/ login。
适用于所有现有控制器/操作。但是,当我输入一个不存在的控制器动作http://www.mypage.de/fake/bla
时,我得到一个notFoundExeption。
我的问题是,用户看到我的管理员布局,因为404是在管理布局模板中呈现的。
有没有办法说管理员(或任何前缀)总是受到限制,而未登录的用户会被重定向到登录页面?
我想出的是这个,但我不喜欢它,因为我必须对所有其他前缀做同样的事情。
/**
* 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);
}
}
答案 0 :(得分:1)
你的代码实际上做得很好,但是没有办法自动为每个前缀执行此操作,除非可以在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页面上看到管理员布局。