Maison >développement back-end >tutoriel php >Yii2用户密码加密后验证问题
使用Yii2框架,密码字段为pass,rules中设定的pass长度范围为6-20;
原密码为123456789,校验通过没有问题,hash后存入数据库,hash后的值肯定超过范围了。
此时pass字段值为hash后的值,没有保存原密码,不可逆加密。
当我更新用户数据的时候
<code class="php">$userInfo = User::findOne(['id'=>1]); $userInfo->last_time = time(); //这个时候就会报错,因为密码长度不符合要求 $userInfo->save(true);</code>
该如何解决这个问题?
现在暂时做的就是修改rules范围,但是这样用户原密码长度的限制条件也跟着修改了。有没有更好的解决方案?
使用Yii2框架,密码字段为pass,rules中设定的pass长度范围为6-20;
原密码为123456789,校验通过没有问题,hash后存入数据库,hash后的值肯定超过范围了。
此时pass字段值为hash后的值,没有保存原密码,不可逆加密。
当我更新用户数据的时候
<code class="php">$userInfo = User::findOne(['id'=>1]); $userInfo->last_time = time(); //这个时候就会报错,因为密码长度不符合要求 $userInfo->save(true);</code>
该如何解决这个问题?
现在暂时做的就是修改rules范围,但是这样用户原密码长度的限制条件也跟着修改了。有没有更好的解决方案?
可以把从 model::scenarios()
里定义的 self::SCENARIO_DEFAULT 的值中去掉 password,
从而在default-scenario下不再验证password
如果你是用的YII2 advanced
的话,你可以看下它默认的用户模型和默认的migration
。
用户模型里的password
字段已经是被定义过了,你无需再次定义。
你把你的password
字段改为password_hash
,保存的时候禁止前端展示和发送password_hash
(这个可以在rule控制)并把password
这个字段带过来,如果password
不为空,则在更新用户信息前执行$user->setPassword(Yii::$app->request->post('password'))
即可(或者写在用户模型的beforeSave
方法里也行)