身份验证是验证用户身份的过程。它通常使用标识符(例如用户名或电子邮件地址)和秘密令牌(例如密码或访问令牌)来判断用户是否是他声称的那个人。身份验证是登录功能的基础。
Yii 提供了一个身份验证框架,它将各种组件连接起来以支持登录。要使用此框架,您主要需要执行以下工作
user 应用程序组件管理用户身份验证状态。它要求您指定一个 身份类,其中包含实际的身份验证逻辑。在以下应用程序配置中,user 的 身份类 被配置为 app\models\User
,其实现将在下一小节中说明。
return [
'components' => [
'user' => [
'identityClass' => 'app\models\User',
],
],
];
身份类 必须实现 yii\web\IdentityInterface,其中包含以下方法
如果某个特定方法不需要,您可以使用空主体来实现它。例如,如果您的应用程序是一个纯无状态的 RESTful 应用程序,您只需要实现 findIdentityByAccessToken() 和 getId(),而将所有其他方法保留为空主体。或者,如果您的应用程序仅使用会话进行身份验证,则需要实现除 findIdentityByAccessToken() 之外的所有方法。
在以下示例中,一个 身份类 被实现为与 user
数据库表关联的 Active Record 类。
<?php
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface
{
public static function tableName()
{
return 'user';
}
/**
* Finds an identity by the given ID.
*
* @param string|int $id the ID to be looked for
* @return IdentityInterface|null the identity object that matches the given ID.
*/
public static function findIdentity($id)
{
return static::findOne($id);
}
/**
* Finds an identity by the given token.
*
* @param string $token the token to be looked for
* @return IdentityInterface|null the identity object that matches the given token.
*/
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
/**
* @return int|string current user ID
*/
public function getId()
{
return $this->id;
}
/**
* @return string|null current user auth key
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* @param string $authKey
* @return bool|null if auth key is valid for current user
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
}
您可以使用以下代码为每个用户生成一个身份验证密钥,然后将其存储在 user
表中。
class User extends ActiveRecord implements IdentityInterface
{
......
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if ($this->isNewRecord) {
$this->auth_key = \Yii::$app->security->generateRandomString();
}
return true;
}
return false;
}
}
注意:不要将
User
身份类与 yii\web\User 混淆。前者是实现身份验证逻辑的类。它通常被实现为与某些持久存储关联的 Active Record 类,用于存储用户凭据信息。后者是一个应用程序组件类,负责管理用户身份验证状态。
您主要通过 user
应用程序组件来使用 yii\web\User。
您可以使用表达式 Yii::$app->user->identity
检测当前用户的身份。它返回一个表示当前登录用户的 身份类 实例,或者如果当前用户未经身份验证(表示访客)则返回 null
。以下代码展示了如何从 yii\web\User 中检索其他与身份验证相关的信息。
// the current user identity. `null` if the user is not authenticated.
$identity = Yii::$app->user->identity;
// the ID of the current user. `null` if the user not authenticated.
$id = Yii::$app->user->id;
// whether the current user is a guest (not authenticated)
$isGuest = Yii::$app->user->isGuest;
要登录用户,您可以使用以下代码。
// find a user identity with the specified username.
// note that you may want to check the password if needed
$identity = User::findOne(['username' => $username]);
// logs in the user
Yii::$app->user->login($identity);
yii\web\User::login() 方法将当前用户的身份设置为 yii\web\User。如果会话已 启用,它将保留会话中的身份,以便在整个会话期间维护用户身份验证状态。如果启用了基于 Cookie 的登录(即“记住我”登录),它还将身份保存在 Cookie 中,以便只要 Cookie 保持有效,就可以从 Cookie 中恢复用户身份验证状态。
为了启用基于 Cookie 的登录,您需要在应用程序配置中将 yii\web\User::$enableAutoLogin 配置为 true
。在调用 yii\web\User::login() 方法时,您还需要提供一个持续时间参数。
要注销用户,只需调用
Yii::$app->user->logout();
请注意,仅当启用会话时,注销用户才有意义。该方法将从内存和会话中清除用户身份验证状态。默认情况下,它还会销毁所有用户会话数据。如果您想保留会话数据,则应改为调用 Yii::$app->user->logout(false)
。
yii\web\User 类在登录和注销过程中引发了一些事件。
false
,则登录过程将被取消。false
,则注销过程将被取消。您可以响应这些事件来实现诸如登录审计、在线用户统计等功能。例如,在 EVENT_AFTER_LOGIN 的处理程序中,您可以将登录时间和 IP 地址记录在 user
表中。
发现错别字或您认为此页面需要改进?
在 github 上编辑它 !
注册 Signup 或登录 Login 以发表评论。