首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii RESTful认证

问Yii RESTful认证
EN

Stack Overflow用户
提问于 2013-07-30 22:05:57
回答 1查看 5K关注 0票数 3

在我的应用程序中,我很难找到验证API用户的方法。我最初打算构建一个用户可以通过web访问和身份验证的系统,但是需求已经发生了变化,我需要使用POST调用实现一些可以以RESTful方式提供的附加操作。

我创建了一个类,它扩展了CBehaviour,并强制所有未经身份验证的用户(在易框架论坛上找到的)重定向到登录页面。问题是,所有API调用都是通过相同的逻辑强制执行的,任何POST请求都只是将HTML吐出到登录页面。

代码语言:javascript
复制
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用户分开?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-30 22:18:52

在Yii中创建REST时,我将遵循这个指南。修改配置urlManager条目后,所有APIController请求都将使用APIController。然后,您可以在您的beforeAction中放置以下代码,如果用户是来宾(或错误消息),则不返回任何内容。

代码语言:javascript
复制
protected function beforeAction($event) {
    if (Yii::app()->user->isGuest) {
        echo "Invalid credentials";
        Yii::app()->end();
    }
}

注意:上面的代码适用于我的目的,因为所有REST请求都是通过同一个浏览器发送的。(它已经登录并具有登录cookie)

如果将此行为替换为放置在protected/controllers中的新基控制器以强制登录,则它只适用于需要登录的页面,而不适用于APIController。下面是我的一个例子:

代码语言:javascript
复制
//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服务,我相信您将不得不提出一个自定义身份验证/令牌方案。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17958291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档