求教:Yii 后台用户修改密码并实现加密

青鸟动力 2014-05-20 03:59:15
Controller:

/**
* 登录管理员修改自身密码
*/
public function actionEdit_pwd(){
$id = Yii::app()->user->id;
$model= Admin::model();
$model->scenario="edit_pwd";
if(isset($_POST['Admin'])){
$password=$_POST['Admin']['password'];
$password2=$_POST['Admin']['new_pwdconfirm'];
if (!empty($password) && !empty($password2) && $password===$password2) {

$_POST['Admin']['password'] = md5(SALT.$password);
$_POST['Admin']['new_pwdconfirm'] = md5(SALT.$password2);
}
$model->setAttribute('userid', $id);
$model->attributes = $_POST['Admin'];
if($model->save())
{
Yii::app()->user->setFlash('status','修改成功,请重新登录');
$this->refresh();
}else{
Yii::app()->user->setFlash('error','请检查输入项');
}
}
$this->render('edit_pwd',array('infos'=>$model));
}

Model:

<?php
class Admin extends CActiveRecord{
public static function model($className = __CLASS__) {
return parent::model($className);
}
public function tableName() {
return '{{admin}}';
}
public $old_pwd;
public $password;
public $new_pwdconfirm;
//数据验证
public function rules()
{
return array(
array('nickname', 'required','message'=>'昵称必填','on'=>'edit_info'),
array('nickname', 'unique','message'=>'昵称已存在','on'=>'edit_info'),
array('email', 'required','message'=>'邮箱必填','on'=>'edit_info'),
array('email', 'unique','message'=>'邮箱已存在','on'=>'edit_info'),
array('email','email','allowEmpty'=>FALSE,'message'=>'邮箱格式不正确','on'=>'edit_info'),
array('old_pwd', 'required','message'=>'旧密码必填','on'=>'edit_pwd'),
array('old_pwd', 'check_old','on'=>'edit_pwd'),
array('password', 'required','message'=>'新密码必填','on'=>'edit_pwd'),
array('password', 'length','tooShort'=>'密码长度至少6位','min'=>6,'on'=>'edit_pwd'),
array('password', 'length','tooLong'=>'密码长度最大20位','max'=>40,'on'=>'edit_pwd'),
array('new_pwdconfirm', 'required','message'=>'确认密码必填','on'=>'edit_pwd'),
array('new_pwdconfirm', 'compare','compareAttribute'=>'password','message'=>'两次密码不一致','on'=>'edit_pwd'),
);
}

//对应标签的名字
function attributeLabels() {
parent::attributeLabels();
return array(
'username'=>'账号',
'nickname'=>'昵称',
'email'=>'邮箱',
'realname'=>'真实姓名',
'old_pwd'=>"旧密码",
'password'=>'新密码',
'new_pwdconfirm'=>'确认新密码',
);
}

//验证旧密码
function check_old(){
$id = Yii::app()->user->id;
$model= Admin::model()->findByPk($id);
$password=$model->password;
if(!$this->validatePassword($this->old_pwd,$password)){
$this->addError('old_pwd', '旧密码不正确');
}
}

public function validatePassword($password,$pwd)
{
return $this->hashPassword($password,SALT)===$pwd;
}

public function hashPassword($password,$salt)
{
return md5($salt.$password);
}
}
?>





问题就在第二张图处,前提是旧密码先填写错误,一旦新密码与验证新密码一致后,就显示加密后的新密码字符串了,之后修正旧密码便修改密码成功,同时,也导致密码两次加密,结果就是用户用新密码再也登录不进去了。
我应该怎么做这一块呢?

补充 :在视图中对新密码和确认新密码进行了 value='' 便避免了二次加密 ,但在用户验证体验上,每次都重置了输入,略显不美。
...全文
1437 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
在 controller中,判断

 if(empty($_POST['Admin']['password'])
{
$model->password = "";
$model->new_pwdconfirm ="";
}
在修改密码的的 form中 使用Yii 的widget activeform,并将 其中 'enableAjaxValidation'=>true, 'enableClientValidation'=>true, 'clientOptions'=>array( 'validateOnSubmit'=>true, ), 这样可以避免验证旧密码成功后,重复输入。
码无边 2014-05-20
  • 打赏
  • 举报
回复
修改密码的时候,为什么拿出加密的密码?为什么不重置原先的密码?

4,250

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧