php - Yii RESTful 认证

标签 php rest authentication yii

我找不到在我的应用程序中对 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");
    }
}

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

最佳答案

我会关注这个 guide在 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 中的新基本 Controller 替换该行为以强制登录,它将仅适用于需要登录的页面,而不适用于您的 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 服务,我相信您必须想出一个自定义身份验证/ token 方案。

关于php - Yii RESTful 认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17958291/

相关文章:

php - 我无法显示查询结果是否为空

php - 按 id 对表元素的值进行分组

php - 执行 mysqli fetch 时出错

android - Google+ Auth 容错(代码已兑换)

spring - 如何在 JWT 身份验证期间或之后设置自定义主体对象?

php - 在 Mac 上将 PHP/MySQL/HTML 生成的报告转换为 PDF 格式

json - 在进行 PATCH 请求时,是否可以在 http header 中传递 json 字符串以向服务器提供选项?

rest - Spring MVC Servlet 被 POST 请求命中两次

c# - REST WCF - 流下载非常慢,65535 (64KB) block 无法更改

authentication - REST 认证/授权