我在应用程序中找不到验证API用户的方法。我最初打算构建一个用户可以通过web访问和验证的系统,但需求已经改变,我需要使用POST API调用以RESTful方式实现一些额外的操作。
我创建了一个扩展CBehaviour
的类,并强制所有未经身份验证的用户重定向到登录页面(可在yii框架论坛上找到)。问题是,所有API调用都是通过相同的逻辑强制执行的,并且任何POST请求都只是将HTML吐出到登录页面。
class ApplicationBehavior extends CBehavior {
private $_owner;
public function events() {
return array(
'onBeginRequest' => 'forceGuestLogin',
);
}
public function forceGuestLogin() {
$owner = $this->getOwner();
if ($owner->user->getIsGuest())
$owner->catchAllRequest = array("site/login");
}
}
如何将API用户的身份验证与Web用户分离?
我将遵循本指南在Yii中创建REST API。修改配置urlManager条目后,所有API请求都将使用APIController。然后,如果用户是访客(或错误消息),您可以将以下代码放在APIController的beforeAction中,以不返回任何内容
protected function beforeAction($event) {
if (Yii::app()->user->isGuest) {
echo "Invalid credentials";
Yii::app()->end();
}
}
注意:上面的代码适用于我的目的,因为所有REST请求都是通过同一个浏览器发送的。(已登录并有登录cookie)
如果将该行为替换为放置在protected/controllers
中的新基本控制器以强制登录,则它将仅适用于需要登录的页面,而不适用于APIController。下面是我的一个例子:
//Make sure all Controllers which require a login inherit from this
class ControllerLoginRequired extends CController {
public function runAction($action) {
if (Yii::app()->user->isGuest && 'site' != $this->route) {
Yii::app()->user->returnUrl = $this->route;
parent::redirect(array('site/login'));
} else {
parent::runAction($action);
}
}
}
所解释的一切都将通过用户登录Yii的同一浏览器适用于REST请求。如果您需要向不是登录Yii的浏览器的消费者公开您的REST服务,我相信您必须想出一个自定义的身份验证/令牌方案。