每页都有yii2 oauth令牌验证

时间:2016-02-25 19:51:53

标签: oauth yii2 yii2-advanced-app

所以我需要在每个页面上验证oauth令牌,但site/loginsite/logoutsite/errorsite/auth除外。建立高级模板,显然会在后端。

在Yii2中这样做的正确方法是什么?

  1. 从某种基本控制器扩展所有控制器?
  2. 在config中引导一个类?
  3. 自定义过滤器?
  4. 行为?
  5. 基本上我只需要在除了上面提到的4之外的每个页面上运行一个函数。

1 个答案:

答案 0 :(得分:1)

Yii 2.0已经将3种身份验证方法实现为过滤器:

yii\filters\auth\CompositeAuth同时使用多个。{它们通常在行为中附加到每个控制器:

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => CompositeAuth::className(),
        'authMethods' => [
            HttpBasicAuth::className(),
            HttpBearerAuth::className(),
            QueryParamAuth::className(),
        ],
    ];
    return $behaviors;
}

并且所有这些属性都有$except$only属性,可以选择要应用它们的操作。所以你可能在SiteController

中有这样的东西
public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => HttpBearerAuth::className(),
        'except' => ['login','logout','error','auth']
    ];
    return $behaviors;
}

并且您可能具有相同的行为,但在所有其他控制器中没有except属性。或者,您可以使所有其他控制器扩展到实现该身份验证器行为的公共控制器。

这些过滤器将使用内置的用户类(在配置文件中设置),该类实现IdentityInterface来验证用户身份。该界面已有findIdentityByAccessToken()方法,您可以使用该方法验证令牌,而不是使用findIdentity()注册已登录的用户,并使其在Yii::$app->user->identityYii::$app->user->id内可访问。

我在这里要解释的是如何在内置Yii RESTful API framework中实现身份验证的总结,这可以在这里更好地解释:

http://www.yiiframework.com/doc-2.0/guide-rest-authentication.html

我认为这是一个很好的例子。还有this tutorial描述了访问令牌的身份验证以及如何在用户类中实现身份验证。它是关于REST的,但非REST应用程序的技术应该相同,因为它们都使用用户类。