YII2 實現(xiàn)修改密碼功能主要難點:1、密碼加密 YII2對密碼加密生成的結果是不同的,即用相同的初始密碼在不同時間得到的加密結果不同,所以我們不能用常用的方法去驗證密碼是否正確(將密碼加密后與數(shù)據(jù)庫中的密碼相比較)。YII2有自己的加密以及密碼驗證流程。 加密 $hash = Yii::$app->getSecurity()->generatePassWordHash('123456']); 驗證 Yii::$app->getSecurity()->validatePassword('123456', $hash),返回true或false2、返回信息處理 Yii::$app->session->setFlash('contact','舊密碼錯誤');//設置 flash return $this->goBack(); //頁面轉跳 Yii::$app->session->getFlash('contact'); //獲取 flash
public function actionPassword(){ $model=new PasswordForm; $request = YII::$app->request; if($request->isPost){ $p = $request->post('PasswordForm'); $id = YII::$app->user->id; $admin= Admin::findIdentity($id); $password = $admin->password; if(Yii::$app->getSecurity()->validatePassword($p['password'], $password)){ if($p['pass1'] == $p['pass2']){ $newPass = Yii::$app->getSecurity()->generatePasswordHash($p['pass1']); $connection = /Yii::$app->db; $r = $connection->createCommand()->update('admin', ['password' => $newPass], 'id='.$id)->execute(); if($r){ Yii::$app->user->logout(); return $this->goHome(); }else{ return $this->goBack(); } } }else{ Yii::$app->session->setFlash('contact','舊密碼錯誤'); return $this->redirect(array('site/password')); } }else{ return $this->render('password',['model'=>$model]); } }代碼優(yōu)化:主要優(yōu)化細節(jié)如下
1、將控制器中的主要邏輯代碼移入模型中
2、優(yōu)化數(shù)據(jù)庫操作
控制器中:
public function actionPassword(){ $model=new PasswordForm; $request = YII::$app->request; if($request->isPost && $model->load(Yii::$app->request->post()) && $model->changePassword()){ Yii::$app->user->logout(); return $this->goHome(); }else{ return $this->render('password',['model'=>$model]); } }模型中:
public function changePassword(){ $id = YII::$app->user->id; $admin= Admin::findIdentity($id); $password = $admin->password; if(Yii::$app->getSecurity()->validatePassword($this->password, $password)){ if($this->pass1 == $this->pass2){ $newPass = Yii::$app->getSecurity()->generatePasswordHash($this->pass1); $admin->password = $newPass; if($admin->save()){ return true; }else{ return false; } }else{ Yii::$app->session->setFlash('contact','兩次新密碼不相等'); return false; } }else{ Yii::$app->session->setFlash('contact','舊密碼錯誤'); return false; } }新聞熱點
疑難解答