gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:24:06 28 4
gpt4 key购买 nike

我正在使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com