©
This document usesPHP Chinese website manualRelease
认证是鉴定用户身份的过程。它通常使用一个标识符 (如用户名或电子邮件地址)和一个加密令牌(比如密码或者存取令牌)来 鉴别用户身份。认证是登录功能的基础。
Yii提供了一个认证框架,它连接了不同的组件以支持登录。欲使用这个框架, 你主要需要做以下工作:
用户组件 yii\web\User 用来管理用户的认证状态。这需要你 指定一个含有实际认证逻辑的认证类 yii\web\User::identityClass。 在以下web应用的配置项中,将用户用户组件 yii\web\User 的 认证类 yii\web\User::identityClass 配置成 模型类app\models\User
, 它的实现将在下一节中讲述。
return['components'=> ['user'=> ['identityClass'=>'app\models\User', ], ], ];
认证类 yii\web\User::identityClass 必须实现包含以下方法的 认证接口 yii\web\IdentityInterface:
用不到的方法可以空着,例如,你的项目只是一个 无状态的 RESTful 应用,只需实现 yii\web\IdentityInterface::findIdentityByAccessToken() 和 yii\web\IdentityInterface::getId() ,其他的方法的函数体留空即可。
下面的例子是一个通过结合了user
数据表的 AR 模型 Active Record 实现的一个认证类 yii\web\User::identityClass。
useyii\db\ActiveRecord;useyii\web\IdentityInterface;classUserextendsActiveRecordimplementsIdentityInterface{publicstaticfunctiontableName(){return'user'; }publicstaticfunctionfindIdentity($id){returnstatic::findOne($id); }publicstaticfunctionfindIdentityByAccessToken($token,$type= null){returnstatic::findOne(['access_token'=>$token]); }publicfunctiongetId(){return$this->id; }publicfunctiongetAuthKey(){return$this->auth_key; }publicfunctionvalidateAuthKey($authKey){return$this->getAuthKey() ===$authKey; } }
如上所述,如果你的应用利用 cookie 登录, 你只需要实现getAuthKey()
和validateAuthKey()
方法。这样的话,你可以使用下面的代码在user
表中生成和存储每个用户的认证密钥。
classUserextendsActiveRecordimplementsIdentityInterface{ ......publicfunctionbeforeSave($insert){if(parent::beforeSave($insert)) {if($this->isNewRecord) {$this->auth_key = \Yii::$app->security->generateRandomString(); }returntrue; }returnfalse; } }
注意:不要混淆
user
认证类和用户组件 yii\web\User。前者是实现 认证逻辑的类,通常用关联了 持久性存储的用户信息的AR模型 Active Record 实现。后者是负责管理用户认证状态的 应用组件。
在user
应用组件方面,你主要用到 yii\web\User 。
你可以使用表达式Yii::$app->user->identity
检测当前用户身份。它返回 一个表示当前登录用户的认证类 yii\web\User::identityClass 的实例, 未认证用户(游客)则返回 null。下面的代码展示了如何从 yii\web\User 获取其他认证相关信息:
// 当前用户的身份实例。未认证用户则为 Null 。$identity= Yii::$app->user->identity;// 当前用户的ID。 未认证用户则为 Null 。$id= Yii::$app->user->id;// 判断当前用户是否是游客(未认证的)$isGuest= Yii::$app->user->isGuest;
你可以使用下面的代码登录用户:
// 使用指定用户名获取用户身份实例。// 请注意,如果需要的话您可能要检验密码$identity= User::findOne(['username'=>$username]);// 登录用户Yii::$app->user->login($identity);
yii\web\User::login() 方法将当前用户的身份登记到 yii\web\User。如果 session 设置为 yii\web\User::enableSession,则使用 session 记录用户身份,用户的 认证状态将在整个会话中得以维持。如果开启自动登录 yii\web\User::enableAutoLogin 则基于 cookie 登录(如:记住登录状态),它将使用 cookie 保存用户身份,这样 只要 cookie 有效就可以恢复登录状态。
为了使用 cookie 登录,你需要在应用配置文件中将 yii\web\User::enableAutoLogin 设为 true。你还需要在 yii\web\User::login() 方法中 传递有效期(记住登录状态的时长)参数。
注销用户:
Yii::$app->user->logout();
请注意,启用 session 时注销用户才有意义。该方法将从内存和 session 中 同时清理用户认证状态。默认情况下,它还会注销所有的 用户会话数据。如果你希望保留这些会话数据,可以换成Yii::$app->user->logout(false)
。
yii\web\User 类在登录和注销流程引发一些事件。
user
表中。