0

在应用程序的某些部分,用户可以通过更改 URL 来做一些坏事。例如,假设他们会更改编辑请求。

http://website.com/edit/4000

但是他们不拥有post 4000,他们可以到达那里的唯一方法是通过URL操作。

在这些情况下,我只想将它们重定向到主页。但是,如果我触发其中一个捕获,我想向自己显示一条消息。(所以这不仅仅是一个简单的重定向问题)

我把它放在引导程序中。

function security_redirect ($msg) {
    if ((not_an_admin) == 1) {
       $this->redirect(array('controller' => 'site', 'action' => 'index'));
    } else {
        die($msg);
    }
}

我收到错误消息:

Using $this when not in object context

当我执行:

security_redirect("Tried to edit a post that isn't yours!");

我能做些什么?我究竟做错了什么?我不明白为什么它不被认为是在一个物体内部……但也许很明显。

4

1 回答 1

4

最好不要为此使用全局方法,而是在这些情况下抛出异常;阅读手册的这一部分Built in Exceptions for CakePHP

例如;

class PostsController extends AppController {

    public function edit ($id)
    {
        if (user isn't allowed to edit this post) {
            throw new ForbiddenException('You are not allowed to edit this post');
        }
    }

}

这是比使用更好的方法,die()因为可以在单元测试中测试异常,并且它将由 CakePHP 错误处理程序处理,这将输出一个也可以设置样式的错误页面

额外的例子

在您的应用程序中设置反馈消息可以通过SessionComponent::setFlash()

要在控制器内执行重定向并输出消息,并让应用程序内的所有控制器都可以使用该功能(方法),请使用类似这样的东西;

应用程序/控制器/AppController.php

class AppController extends Controller
{    
    protected function security_redirect ($msg)
    {
        if ((not_an_admin) == 1) {
            // optionally, set 'flash' message
            $this->Session->setFlash($msg);
            return $this->redirect(array('controller' => 'site', 'action' => 'index'));
        } else {
            throw new ForbiddenException($msg);
        }
    }
}

在其他控制器中,您可以像这样访问此方法;

class PostsController extends AppController
{    
    public function edit ($id)
    {
        if (/* user isn't allowed to edit this post */) {
            return $this->security_redirect('You are not allowed to edit this post');
        }
    }    
}
于 2013-05-12T00:05:58.367 回答