cakephp3.0 出现内部错误时强制用户注销

Forced user logout in case of internal errors in cakephp3.0

我正在使用 cakephp 3.0,在我的应用程序中我想强制用户注销或清除会话以防发生任何内部错误,我该如何实现。我可以在错误控制器中进行任何更改吗?它是否能够捕获特定的内部错误。

CakePHP 使用 ErrorController 为未处理的异常和致命错误呈现 HTTP 响应。请记住,它也用于 404 未找到异常。

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

我给你一个警告。 ErrorController 应该尽可能简单。不应执行繁重的逻辑。原因很简单。如果您在 ErrorController 中产生致命错误,它会创建一个无限循环。

大多数人在他们的基础 AppController 中配置他们的 AuthComponent,你不应该将其扩展为 ErrorController 的基础 class。

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

如果你走那条路。还将您的代码包装在 try/catch 块中,以防止从 ErrorController.

内部抛出异常

例如;

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

替代执行 302 重定向:

最好尽可能保持 ErrorController 原版,不要在其中加载 AuthComponent。我假设您已经设置了一个用于登录和注销用户的控制器。为该控制器添加一个名为 "forced_out" 的新路由,然后在存在未捕获的异常时将 URL 重定向到该路由。在 "forced_out" 的操作中,您可以注销当前用户。

像这样创建一个新的错误处理程序class。

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'
         ));
    }
}

现在仅当用户登录时才记录该错误 class。您可以在 AppControllerbeforeFilter 中执行此操作,如下所示:

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.