微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php-Yii RESTful身份验证

我在寻找我的应用程序中用于验证API用户身份的方法时遇到了麻烦.我最初打算构建一个用户可以通过Web访问和进行身份验证的系统,但是需求已发生变化,我需要实施一些其他操作,这些操作可以使用POST API调用以RESTful方式使用.

我创建了一个扩展CBehavIoUr的类,并为所有未经身份验证的用户(found on the yii framework forum here)强制重定向登录页面.问题在于,所有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");
    }
}
@H_502_9@

如何将API用户的身份验证与Web用户分开?

解决方法:

我将按照此guide在Yii中创建REST API.修改config urlManager条目后,所有API请求都将使用API​​Controller.然后,您可以将以下代码放置在APIController的beforeAction中,如果用户是访客,则不返回任何内容(或错误消息)

protected function beforeAction($event) {
    if (Yii::app()->user->isGuest) {
        echo "Invalid credentials";
        Yii::app()->end();
    }
}
@H_502_9@

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

如果您用放置在保护/控制器中的新基本控制器替换该行为以强制登录,则该行为仅适用于需要登录页面,而不适用于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);
        }
    }
}
@H_502_9@

所解释的所有内容都将通过用户登录到Yii的同一浏览器来处理REST请求.如果您需要将REST服务提供给不是登录到Yii的浏览器的使用者,我相信您将不得不提出一个自定义的身份验证/令牌方案.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐