用于普通请求的 CakePHP 表单身份验证,具有 JSON 的基本身份验证


CakePHP form authentication for normal requests with basic authentication for JSON

我正在尝试构建一个Web应用程序,用户可以在浏览器中查看,但也有一个API供开发人员与我的应用程序交互。我的问题是我如何根据 CakePHP 中的请求类型更改身份验证?

我希望我的应用程序通过表单身份验证提示用户使用该站点,但是当请求带有".json"以使用基本身份验证时。

我已经在我的应用程序控制器中尝试过这个:

class AppController extends Controller {
public $components = array(
    'Session',
    'Auth' => array(
         'loginRedirect' => array(
             'controller' => 'journeys', 
             'action' => 'index'
             ),
        'logoutRedirect' => array(
            'controller' => 'pages', 
            'action' => 'display', 'home'
            )
    ),
    'RequestHandler'
);
public function beforeFilter() {
    if($this->params['ext'] == 'json') {
        $this->Auth->authenticate = array('Basic');
    } else {
        $this->Auth->authenticate = array('Form');
    }
    $this->Auth->allow('display'); 
}

}

我已经检查了 beforeFilter 中的子句是否有效并且确实有效,但无论我尝试在我的应用程序中访问什么 URL,我似乎都会被重定向到我的表单身份验证

我的用户控制器文件中的登录函数如下所示:

if ($this->Auth->login()) {
    return $this->redirect($this->Auth->redirect());
} else {
    $this->Session->setFlash(__('Username or password is incorrect'), 'default', array(), 'auth');
}

我已经阅读了CakePHP网站上的文档,但我似乎找不到可以帮助我的示例。任何帮助将不胜感激。

编辑以更正代码和更多信息

我一直在研究这个问题,我注意到如果我记录以下值:

$this->Auth->authenticate

在之前的过滤器中,它说它是基本的,但它仍然将我发送到表单登录。

摘自

文档(见 http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html):

因为基本身份验证和摘要式身份验证不需要初始 POST 或表单,因此如果仅使用基本/摘要式身份验证器,则不会 需要在控制器中执行登录操作。您也可以设置 AuthComponent::$sessionKey 到 false 以确保 AuthComponent 不会 尝试从会话中读取用户信息。

因此,您不需要登录操作。您可以在用户控制器中检查身份验证方法,如果身份验证方法为"基本",则可以跳过登录操作。