CakePHP使用JSON的基本身份验证对正常请求进行身份验证

时间:2013-01-29 16:36:18

标签: php cakephp basic-authentication cakephp-2.2 http-basic-authentication

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

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

我在AppController中试过这个:

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

我的UsersController文件中的登录功能如下所示:

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
在beforeFilter中它表示它是基本的,但它仍然将我发送到表单登录。

1 个答案:

答案 0 :(得分:0)

摘自文档(请参阅http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html):

  

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

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