摘要:密碼加密時遇到的問題今天遇到密碼加密的問題,當時使用的是模型數據完成實現的自動進行加密,但是在上面模型修改器中發現修改器和數據完成功能一樣,看下方的評論說是數據完成和修改器配合使用,我就照著做,當時這樣寫的模型層包含新增和更新操作,
密碼加密時遇到的問題
今天遇到密碼md5加密的問題,當時使用的是 "thinkphp5.0.9->模型->數據完成" 實現的自動進行加密,但是在上面 "thinkphp5.0.9->模型->修改器" 中發現修改器和數據完成功能一樣,看下方的評論說是數據完成和修改器配合使用,我就照著做,當時這樣寫的:
//模型層 class User extends Model{ //$auto包含新增$insert和更新操作$update,就是不管新增還是更新我就自動執行 protected $auto = ["password","create"]; public function setPasswordAttr($value) { return md5($value); } public function setCreateAttr() { return time(); } //注冊用戶 public function register($data){ $bool = $this->save($data); return $bool ? $this->id : 0; } } //控制器層方法 public function register() { if(request()->isAjax()){ $userModel=new appindexModelUser(); $data=input("post."); //注冊 $res = $userModel->register($data); echo $res; }else{ $this->error("非法訪問"); } }
我輸入 "wwwwww" 按照上面的代碼進行注冊后password加密結果是b8d3c8f4db0c248ac242dd6e098bbf85多帶帶拿出來測試正確的加密結果是 d785c99d298a4e9e6e13fe99e602ef42,這個時候你可能沒發現,當你登陸的時候就是登陸不上去,你肯定再去注冊一個新用戶,比如密碼還是wwwwww,你登陸的時候還是登陸不上去,只能懷疑加密出錯,再往上找到了 "數據完成的setPasswordAttr()"
直接說答案吧,我當時看了多遍修改器和數據完成測試兩個小時終于知道原因了,新建的test表
//新建test模型層 namespace appindexModel; use thinkModel; class Test extends Model { protected $auto = ["password"]; protected function setPasswordAttr($value) { dump(md5(NULL)); dump($value); dump(md5($value)); return md5($value); } public function addPass(){ echo "修改器"; $this->password="wwwwww"; dump($this->password); echo "數據完成"; $this->save([ "username" => "thinkphp", "password" => "wwwwww", "create" => "123456" ]); } } //控制器中添加test方法 public function test(){ $user = model("Test"); //調用model層函數 $user->addPass(); }多帶帶測試修改器
首先注釋掉模型層中的 “數據完成” 部分
namespace appindexModel; use thinkModel; class Test extends Model { protected $auto = ["password"]; protected function setPasswordAttr($value) { dump(md5(NULL));//把NULL加密 dump($value); //查看調用時傳遞過來的值 dump(md5($value));//把該值加密 return md5($value);//把該值加密返回 } public function addPass(){ echo "修改器:修改器的作用是可以在數據賦值的時候自動進行轉換處理"; $this->password="wwwwww"; dump($this->password);//輸出返回后的結果 // echo "數據完成:在數據字段insert,update,auto時進行處理"; // $this->save([ // "username" => "thinkphp", // "password" => "wwwwww", // "create" => "123456" // ]); } }
執行后頁面顯示結果,通過結果發現修改器是在賦值的時候執行的自動加密,注意:此時并沒有存入數據庫!
修改器:修改器的作用是可以在數據賦值的時候自動進行轉換處理 string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密的NULL】 string(6) "wwwwww"【傳過來的$value】 string(32) "d785c99d298a4e9e6e13fe99e602ef42"【加密$value】 string(32) "d785c99d298a4e9e6e13fe99e602ef42"【return返回的結果】測試數據完成
注釋掉“修改器”部分的代碼,僅執行數據完成
namespace appindexModel; use thinkModel; class Test extends Model { protected $auto = ["password"]; protected function setPasswordAttr($value) { dump(md5(NULL));//把NULL加密 dump($value); //查看調用時傳遞過來的值 dump(md5($value));//把該值加密 return md5($value);//把該值加密返回 } public function addPass(){ // echo "修改器:修改器的作用是可以在數據賦值的時候自動進行轉換處理"; // $this->password="wwwwww"; // dump($this->password);//輸出返回后的結果 echo "數據完成:在數據字段insert,update,auto時進行處理"; $this->save([ "username" => "thinkphp", "password" => "wwwwww", "create" => "123456" ]); } }找到原因
執行后發現setPasswordAttr()被執行了兩次,所以password也被加密了兩次;
數據完成:在數據字段insert,update,auto時進行處理 string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】 string(6) "wwwwww"【傳入的$value】 string(32) "d785c99d298a4e9e6e13fe99e602ef42"【加密$value="wwwwww"】 string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】 string(32) "d785c99d298a4e9e6e13fe99e602ef42"【傳入的$value】 string(32) "b8d3c8f4db0c248ac242dd6e098bbf85"【再次加密$value="d785c99...f42"】
加密兩次的原因是在賦值的時候加密一次,自動完成$auto時加密了一次
[ "username" => "thinkphp", "password" => "wwwwww", "create" => "123456" ]解決開始的問題
如果想要加密一次就把 protected $auto = ["password"]; 注釋掉,或者在登陸的代碼中進行md5(md5("wwwwww")),注釋掉后執行:
數據完成:在數據字段insert,update,auto時進行處理 string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】 string(6) "wwwwww"【$value】 string(32) "d785c99d298a4e9e6e13fe99e602ef42"【加密結果】
如果是多個字段protected $auto = ["password","create"];就把password去掉就可以了protected $auto = ["create"];,所以最開始的問題就解決了。當只有數據完成但不賦值
在上面可能注意到我怎么老是加密 NULL 干什么,還有另一種情況就是 protected $auto = ["password"]; 定義了自動完成,但是我并沒有賦值:
namespace appindexModel; use thinkModel; class Test extends Model { protected $auto = ["password"]; protected function setPasswordAttr($value) { dump(md5(NULL));//把NULL加密 dump($value); //查看調用時傳遞過來的值 dump(md5($value));//把該值加密 return md5($value);//把該值加密返回 } public function addPass(){ // echo "修改器:修改器的作用是可以在數據賦值的時候自動進行轉換處理"; // $this->password="wwwwww"; // dump($this->password);//輸出返回后的結果 echo "數據完成:在數據字段insert,update,auto時進行處理"; $this->save([ "username" => "thinkphp", //注釋掉,不賦值 // "password" => "wwwwww", "create" => "123456" ]); } }
執行后,加密的是 NULL
數據完成:在數據字段insert,update,auto時進行處理 string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】 NULL【沒有傳值,$value=NULL】 string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密$value,剛好等于NULL加密結果】
剩下的$update和$insert使用方法同$auto一樣,$auto包含$update和$insert總結
修改器會在賦值時執行;數據完成會被執行兩次,一次是賦值時,一次是寫入數據時
希望手冊能稍微詳細一點點,白白耽誤我開發時間,特此分享,大家少踩坑,如果理解的不對請指正,謝謝
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23170.html
摘要:即基于拿來即用高性能后臺管理系統官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發工作。 新版本在線體驗地址已經上線,歡迎體驗? ---2017-01-14 喜歡就Star,不只是Fork; 想要分享的動機才是驅動力,而技術僅僅是一種方法。 ====================...
摘要:即基于拿來即用高性能后臺管理系統官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發工作。 新版本在線體驗地址已經上線,歡迎體驗? ---2017-01-14 喜歡就Star,不只是Fork; 想要分享的動機才是驅動力,而技術僅僅是一種方法。 ====================...
摘要:數據庫文件已經上傳,安裝配置就可以使用簡稱即基于的后臺管理系統官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發工作。 喜歡就Star,不只是Fork; 想要分享的動機才是驅動力,而技術僅僅是一種方法。 數據庫文件已經上傳,安裝配置就可以使用 showImg(https://seg...
摘要:數據庫文件已經上傳,安裝配置就可以使用簡稱即基于的后臺管理系統官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發工作。 喜歡就Star,不只是Fork; 想要分享的動機才是驅動力,而技術僅僅是一種方法。 數據庫文件已經上傳,安裝配置就可以使用 showImg(https://seg...
閱讀 2112·2023-04-26 00:41
閱讀 1142·2021-09-24 10:34
閱讀 3573·2021-09-23 11:21
閱讀 4031·2021-09-22 15:06
閱讀 1557·2019-08-30 15:55
閱讀 897·2019-08-30 15:54
閱讀 1829·2019-08-30 15:48
閱讀 550·2019-08-29 13:58