这两天在用修改器对密码进行md5加密时出现了一个bug
新增用户和首次修改密码可以正常进行,但是第二次再修改密码一直无法正确比对原密码
查了大半天,发现在用thinkphp5 Model类的save方法进行更新操作时,save方法内部调用了两次自动完成 对密码进行了两次加密
下面是thinkphp5 Model类的save方法 1071行~1081行
可以看到 当进行更新操作时 autoCompleteData方法调用了两次
// 数据自动完成
$this->autoCompleteData($this->auto);
// 事件回调
if (false === $this->trigger('before_write', $this)) {
return false;
}
$pk = $this->getPk();
if ($this->isUpdate) {
// 自动更新
$this->autoCompleteData($this->update);我写的修改密码方法如下 public function edit(Request $request){
$code = $this->code["edit"];
if(!$request->isPut()){
return json(["code"=>$code["wrong_method"],"msg"=>"请求方式错误"]);
}
$input = $request->put();
if(empty($input["username"]) || empty($input["password"]) || empty($input["new_password"])){
return json(["code"=>$code["argument_error"],"msg"=>"参数错误"]);
}
try{
$admin = new Admin();
$result = $admin->where("username","=",$input["username"])->find();
if(!$result){
return json(["code"=>$code["username_not_exist"],"msg"=>"用户名不存在"]);
}
dump($result["password"]);
dump(md5($input["password"]));
if($result["password"] != md5($input["password"])){
return json(["code"=>$code["password_incorrect"],"msg"=>"密码错误"]);
}
$res = $admin->save([
"password"=>$input["new_password"]
],["username"=>$input["username"]]);
if($res){
return json(["code"=>$code["edit_success"],"msg"=>"修改成功"]);
}
return json(["code"=>$code["unknown_error"],"msg"=>"修改失败"]);
}catch (\Exception $e){
return json(["code"=>$code["unknown_error"],"msg"=>$e->getMessage()]);
}
}模型类代码如下namespace app\admin\model;
use think\Model;
class Admin extends Model{
protected $auto = ["password"];
protected $insert = ["id"];
protected $readonly = ["id","username"];
public function setIdAttr(){
return md5(uniqid().rand(1000,9999));
}
public function setPasswordAttr($password){
return md5($password);
}
}目前我想到的解决办法是将输入的密码进行两次md5加密再比对原密码if($result["password"] != md5(md5($input["password"]))){
return json(["code"=>$code["password_incorrect"],"msg"=>"密码错误"]);
}不知道这是tp5的bug还是我学艺不精 (`・ω・´)最佳答案