php - 在 cakephp3.0 内部错误的情况下强制用户注销

标签 php cakephp error-handling cakephp-3.0

我正在使用 cakephp 3.0,在我的应用程序中,如果发生任何内部错误,我希望强制用户注销或清除 session ,我该如何完成它。我可以在错误 Controller 中进行任何更改,它是否能够捕获特定的内部错误。

最佳答案

CakePHP 使用 ErrorController为未处理的异常和 fatal error 呈现 HTTP 响应。请记住,它也用于 404 not found 异常。

您可以在 ErrorController 中注销用户在 beforeFilter事件,并正常呈现错误消息。之后,他们的 session 将结束。

我给你一个警告。 ErrorController应尽可能简单。不应执行繁重的逻辑。原因很简单。如果您在 ErrorController 内部生成 fatal error 它创建了一个无限循环。

大多数人配置他们的AuthComponent在他们的基地AppController你不应该将其扩展为 ErrorController 的基类.

这意味着您必须配置 AuthComponent分别在您的ErrorController并希望它永远不会失败,并且您保持配置与 AppController 中的配置一致.

如果你走那条路。还将您的代码包装在 try/catch 中阻止从 ErrorController 内部抛出异常.

例如;

public function beforeFilter(Event $event)
{
    try {
        $this->Auth->logout();
    }catch(\Exception $ex) {
        // prevent endless loop
    }
}

替代执行 302 重定向:

最好保留ErrorController尽可能 Vanilla 而不加载AuthComponent在里面。我假设您已经设置了一个用于登录和注销用户的 Controller 。为该 Controller 添加一个名为“forced_out”的新路由,然后在出现未捕获的异常时将 URL 重定向到该路由。在“forced_out”的操作中,您可以注销当前用户。

像这样创建一个新的错误处理程序类。
class ForceOutErrorHandler extends ErrorHandler {
    protected function _displayException($exception)
    {
         // restore the old handler
         (new ErrorHandler(Configure::read('Error')))->register();

         throw new RedirectException(Router::url([
            'controller'=>'Users',
            'action'=>'forced_out'
         ));
    }
}

现在仅在用户登录时注册该错误类。您可以在 beforeFilter 中执行此操作。您的AppController像这样:
public function beforeFlter(Event $event) {
     if($this->Auth->user()) {
        (new ForceOutErrorHandler(Configure::read('Error')))->register()
     }
}

Note: I'm not sure if CakePHP will catch the redirect exception from inside the error handler like that or not. You might have to use header(); die() as a last try.

关于php - 在 cakephp3.0 内部错误的情况下强制用户注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785849/

相关文章:

php - 嵌套的 while 循环只运行一次

multithreading - 在实践中在哪里以及如何使用 Actor

ruby-on-rails - heroku 不显示自定义错误页面

javascript - Internet Explorer HTML 标记未立即更新

php - sleep 不到一秒的正确跨平台方法是什么?

php - 从动态生成的输入字段 PHP、MySQL、jQuery 更新多行

mysql - 加速复杂的多连接 MySQL 查询(如果重要的话可以通过 CakePHP 创建)

php - CakePHP 2.x 无法更新最近添加到 MySQL 表的字段

linux - 自动从临时文件夹 [CakePHP] 中删除文件

java - 在没有异常类的java中创建自定义异常?