CakePHP 3 Json 响应而不是重定向(如果 ext = json )

CakePHP 3 Json response instead of redirect ( if ext = json )

本文关键字:如果 ext json 重定向 Json 响应 CakePHP      更新时间:2023-09-26

有没有简单的方法来配置 CakePHP 身份验证组件以发送 json 响应而不是正常重定向到登录 url。

我使用了许多 ajax 请求,当会话过期时,ajax 请求将获得我主页的 html 而不是 json 编码状态的响应。

我希望 CakePHP 发送以下 json 响应,如果用户未登录,并且查询是使用 json 扩展进行的。

{status: false, message: "Please log in"}

非 ajax 页面加载仍然需要像往常一样重定向。

您应该查看系统在哪里检查您是否已登录,并查看未登录的情况。将以下if环绕在它周围:

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
   //put here the html for the log in screen
} else {
   $response = '{status: false, message: "Please log in"}';
   echo json_encode($response);
}

由于很难确定是否发出 ajax 请求,Cake 3 使用 X-Request-With = XMLHttpRequest。这似乎是jquery的默认值(但谁再使用它呢?

您需要手动设置该标头,以允许 cakephp 检测到您的请求确实是 ajax。

您的 ajax 请求可能适用于其他页面,因为您可能正在设置 _serialize var 并设置接受标头或使用 .json 扩展名强制使用 json。但是,auth 函数不检查接受标头,它只检查 X-Request-With 标头。

因此,请在 xhr 请求中验证 X-Request-With 是否为 XMLHttpRequest,您应该会收到 403。

如果要进一步自定义返回的元素或数据,请查看AuthComponent ajaxLogin参数。

处理 Ajax 未授权

基本上,您需要将值设置为要渲染的元素。Cake 将查看您的元素模板路径并加载该元素。

// In your AppController
$this->loadComponent('Auth', [
        'ajaxLogin' => 'yourAjaxElement', // This is what is important
        // Optional stuff....
        'authenticate' => [
            'Form' => [
                'finder' => 'AuthUser'
            ]
        ],
        'authorize' => ['Controller'],
        // More settings...

然后创建此元素

Template/Element

/yourAjaxElement.ctp

快乐编码。