使用Yii2架構,密碼欄位為pass,rules中設定的pass長度範圍為6-20;
原密碼為123456789,校正通過沒有問題,hash後存入資料庫,hash後的值肯定超過範圍了。
此時pass欄位值為hash後的值,沒有儲存原密碼,無法復原加密。
當我更新使用者資料的時候
$userInfo = User::findOne(['id'=>1]);$userInfo->last_time = time();//這個時候就會報錯,因為密碼長度不符合要求$userInfo->save(true);
該如何解決這個問題?
現在暫時做的就是修改rules範圍,但是這樣使用者原密碼長度的限制條件也跟著修改了。有沒有更好的解決方案?
回複內容:
使用Yii2架構,密碼欄位為pass,rules中設定的pass長度範圍為6-20;
原密碼為123456789,校正通過沒有問題,hash後存入資料庫,hash後的值肯定超過範圍了。
此時pass欄位值為hash後的值,沒有儲存原密碼,無法復原加密。
當我更新使用者資料的時候
$userInfo = User::findOne(['id'=>1]);$userInfo->last_time = time();//這個時候就會報錯,因為密碼長度不符合要求$userInfo->save(true);
該如何解決這個問題?
現在暫時做的就是修改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
方法裡也行)