所以我需要在每个页面上验证oauth令牌,但site/login
,site/logout
,site/error
,site/auth
除外。建立高级模板,显然会在后端。
在Yii2中这样做的正确方法是什么?
基本上我只需要在除了上面提到的4之外的每个页面上运行一个函数。
答案 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->identity
或Yii::$app->user->id
内可访问。
我在这里要解释的是如何在内置Yii RESTful API framework中实现身份验证的总结,这可以在这里更好地解释:
http://www.yiiframework.com/doc-2.0/guide-rest-authentication.html
我认为这是一个很好的例子。还有this tutorial描述了访问令牌的身份验证以及如何在用户类中实现身份验证。它是关于REST的,但非REST应用程序的技术应该相同,因为它们都使用用户类。