我正在尝试构建一个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 不会 尝试从会话中读取用户信息。
因此,您不需要登录操作。您可以在用户控制器中检查身份验证方法,如果身份验证方法为"基本",则可以跳过登录操作。