Yii RESTful 认证

3
我在应用程序中找不到一种认证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用户分离?

1个回答

3
我会遵循这个指南来创建一个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请求。如果您需要将REST服务暴露给未登录Yii浏览器的消费者,我认为您需要想出一种自定义的身份验证/令牌方案。


是的,我已经从那个教程中收集了一些代码,它几乎是唯一一个解释Yii中REST API的教程,并且每个人都会引用它。问题仍然存在,我的CBehavior扩展将强制访客登录,这将覆盖API控制器中的任何内容,因为它在其之前执行。 - Matt K
1
不要使用行为重定向到登录页面,而是使用一个LoginRequiredController,让所有需要登录的控制器都继承它。如果你这样做,至少可以解决这个问题。REST的APIController不会从那个控制器继承。 - Mikt25
顺便提一下,如果没有提到,您可以将其放在protected/components中,这样它就会被自动加载(因为控制器默认情况下不会被自动加载),您就不必在所有需要扩展它的控制器中导入它。 - Matt K
我刚刚修复了一点代码,尝试访问登录页面将导致无限重定向循环。 - Matt K
我的站点控制器也扩展了LoginRequired类,如果访客未经过身份验证,则会被重定向到“site/login”...这将触发相同的重定向逻辑无限循环。 - Matt K
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接