【问题标题】:CakePHP 3 Json response instead of redirect ( if ext = json )CakePHP 3 Json 响应而不是重定向(如果 ext = json)
【发布时间】:2016-06-25 15:46:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 既然您指的是扩展,我可以假设您的请求 URL 看起来像 /xyz.json,并且您已启用请求处理程序组件以及扩展解析吗?

标签: javascript php authentication cakephp-3.0


【解决方案1】:

你应该看看系统在哪里检查你是否登录并查看它没有登录的情况。将以下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);
}

【讨论】:

  • 由于OP使用的是CakePHP,所以最好采用Cake方式,即使用框架提供的功能。
  • @ndm,不一定。实际上,我认为这个想法是优越的,因为它也可以在框架之外使用。
  • 但问题不是关于“框架之外”,而是关于 CakePHP,以及用不遵循其约定的代码填充构建在框架上的应用程序,通常似乎并不对我来说这是一个好主意,因为它可能对测试有问题(例如,你破坏了集成测试用例,因为$_SERVER 不会被填充),对于其他必须处理代码的开发人员来说是不愉快的,等等。 ..
  • Jup,我想以正确的方式使用 CakePHP。根据请求类型要求不同的登录/重定向行为一定很常见,以至于我认为有一种 CakePHP 方法可以做到这一点。我只是无法从文档中找到解决方案。
【解决方案2】:

由于很难确定您是否在发出 ajax 请求,Cake 3 使用 X-Requested-With = XMLHttpRequest。似乎这是 jquery 的默认设置(但谁再使用它?说真的。)。

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

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

所以在你的 xhr 请求中验证 X-Requested-With 是 XMLHttpRequest 并且你应该收到一个 403。

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

Handle Ajax Unauthorized

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

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

然后创建这个元素

模板/元素/yourAjaxElement.ctp

编码愉快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多