2

我正在尝试构建一个用户可以在浏览器中查看的 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 中它说它是基本的,但它仍然将我发送到表单登录。

4

1 回答 1

0

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

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

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

于 2013-10-23T11:30:00.843 回答