yii2 的登陆流程
在数据库中建立user表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`username` varchar(255) NOT NULL COMMENT '用户名',
`auth_key` varchar(32) NOT NULL COMMENT '自动登录key',
`password_hash` varchar(255) NOT NULL COMMENT '加密密码',
`password_reset_token` varchar(255) DEFAULT NULL COMMENT '重置密码token',
`email` varchar(255) NOT NULL COMMENT '邮箱',
`role` smallint(6) NOT NULL DEFAULT '10' COMMENT '角色等级',
`status` smallint(6) NOT NULL DEFAULT '10' COMMENT '状态',
`created_at` int(11) NOT NULL COMMENT '创建时间',
`updated_at` int(11) NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='用户表'
然后跟着测试发现跳转流程大概是这样的
1、SiteController
public function actionLogin()
{
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {//加在post数据,并验证登陆
return $this->goBack();
} else {
$this->layout = "login.php";
return $this->render('login', [
'model' => $model,
]);
}
}
2、跟进到$model->login,也就是common/modules/LoginForm.php文件中的login函数
public function login()
{
if ($this->validate()) {//表单验证通过
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
} else {
return false;
}
}
3、这个表单验证,主要是对loginFrom中的rules规则进行验证
public function rules()
{
return [
// username and password are both required
[['username', 'password'], 'required'],
// rememberMe must be a boolean value
['rememberMe', 'boolean'],
// password is validated by validatePassword()
['password', 'validatePassword'],
];
}
4、其中,password需要去验证validatePassword函数,这个函数用于判断密码的格式是否正确
public function validatePassword($attribute, $params)
{
if (!$this->hasErrors()) {
$user = $this->getUser();
if (!$user || !$user->validatePassword($this->password)) {
$this->addError($attribute, \Yii::t('login', 'Incorrect username or password.'));
}
}
}
5、这里需要注意的是,$this->getUser();的时候,已经获得了user对象,其中包含了该用户的password_hash这个变量。
这里面的!$user->validatePassword($this->password)是去判断了common/modules/user.php中的函数
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password_hash);//其中$password,是用户输入的密码,而$this->password_hash是数据库中存储的用户password_hash
}
用户密码正确后,回到2、执行
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
这步骤是执行用户登录操作,并保存cookie
其中
Yii::$app->user是在\yii\console\Application|\yii\web\user.php
public function login(IdentityInterface $identity, $duration = 0)
{
if ($this->beforeLogin($identity, false, $duration)) {
$this->switchIdentity($identity, $duration);
/*************
switchIdentity函数用于
1、设置session的有效期
2、如果cookie的有效期大于0并且允许自动登录,那么就把用户的认证信息保存到cookie中
3、如果允许自动登录,删除cookie信息。这个是用于退出的时候调用的。退出的时候传递进来的$identity为null
************/
$id = $identity->getId();
$ip = Yii::$app->getRequest()->getUserIP();
if ($this->enableSession) {
$log = "User '$id' logged in from $ip with duration $duration.";
} else {
$log = "User '$id' logged in from $ip. Session not enabled.";
}
Yii::info($log, __METHOD__);
$this->afterLogin($identity, false, $duration);
}
return !$this->getIsGuest();
}
以上内容参考了 https://www.cnblogs.com/shiguangkejian/p/5149175.html


浙公网安备 33010602011771号