代码之家  ›  专栏  ›  技术社区  ›  Rosa Mystica

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

  •  0
  • Rosa Mystica  · 技术社区  · 6 年前

    我使用的是cakephp 3.0,在我的应用程序中,我希望强制用户注销或清除会话,以防出现任何内部错误,我如何才能做到这一点。我是否可以在错误控制器中进行任何更改,它是否能够捕获特定的内部错误。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Reactgular    6 年前

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

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

    我给你一个警告。这个 错误控制器 应该尽可能简单。不应执行重逻辑。原因很简单。如果在内部生成致命错误 错误控制器 它创造了一个无休止的循环。

    大多数人配置他们的 AuthComponent 在他们的基地 AppController 您永远不应该将其扩展为的基类 错误控制器 .

    这意味着您必须配置 AuthComponent 在您的 错误控制器 希望它永远不会失败,并且您可以使配置与现有配置保持一致 AppController .

    如果你走那条路。还可以将代码包装在 try/catch 阻止从内部引发异常 错误控制器 .

    例如

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

    或者执行302重定向:

    最好保持 错误控制器 尽可能普通,不要加载 AuthComponent 在里面。我假设您已经为用户登录和注销设置了一个控制器。为该控制器添加一个名为“forced\u out”的新路由,然后在出现未捕获的异常时将URL重定向到该路由。在“forced\u 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'
             ));
        }
    }
    

    现在,仅当用户登录时才注册该错误类。您可以在 前过滤器 您的 AppController 这样地:

    public function beforeFlter(Event $event) {
         if($this->Auth->user()) {
            (new ForceOutErrorHandler(Configure::read('Error')))->register()
         }
    }
    

    注意:我不确定CakePHP是否会像这样从错误处理程序内部捕获重定向异常。您可能需要使用 header(); die() 作为最后一次尝试。