2014-07-10 73 views
0

我使用Cake 2.1.1並嘗試編寫ajax函數以將用戶密碼重置爲特定格式。我已經能夠更改密碼,但不能讓這個新密碼實際工作登錄用戶更改密碼在cakephp中設置值

我在我的用戶控制這個功能:

function ajax_reset_password(){ 
    $this->autoRender=false; 

    $user = $this->User->find('first',array(
     'conditions'=>array('User.email'=>$_GET['email']) 
    )); 
    $this->User->id = $user['User']['id']; 

    $pass = $_GET['name'].'2014'; 
    $passHashed= $this->Auth->password($pass); 

    $this->User->set('password', $pass); 
    $this->User->set('updated_at',date("Y-m-d H:i:s")); 
    $this->User->save(); 

    //... code to email user new password 
} 

這是我的用戶控制器beforeSave:

public function beforeSave(){ 
    if (isset($this->data['User']['password'])) { 
     $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']); 
    } 
    return true; 
} 

如果我運行這個功能,並檢查我的數據庫,我可以看到密碼的值更改字面上「name2014」,但我不能與密碼登錄。

如果我將密碼設置爲$ passHashed並檢查數據庫,我發現密碼的值已更改爲散列值,但我再次無法使用新密碼進行登錄。

我的Users表中還有一個'salt'字段,永遠不會改變。

我猜測,問題是鹽需要用密碼哈希更新以正確解密它,但我不確定如何更新鹽。我可以在我的控制器中獲得它,並直接設置值,或者用AuthComponent以其他方式處理?

有關此主題的其他帖子似乎與我一直使用的代碼正常工作,但我也沒有發現任何試圖直接設置密碼值。

+0

你爲什麼要哈希兩次?你應該讓模型層處理哈希,不需要額外的東西。另外,你可能想看看[這篇文章](http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/)。也許你喜歡乾淨的方式來存儲和更新密碼的DRY方法。 – mark

+0

在ajax函數中的散列只是一個測試。似乎beforeSave從未運行,因爲密碼不會被散列,如果我不在ajax函數中執行它 – Cbas

回答

0

使用您在beforeSave()中擁有的內容。 (不要在Controller中嘗試哈希路由)。

如果它不散列,只是做了一些標準的調試,並找出爲何沒有進入的那部分代碼:

debug($this->data); 
exit; 
if (isset($this->data['User']['password'])) { 
    // IT'S NOT GETTING HERE 
    //... 

這是其中的一個,其中「答案」僅僅是一個向微調調試你的代碼,因爲很明顯,你可以在哪裏找到究竟發生了什麼,以及爲什麼只要看看數據和什麼時候發生了什麼。

+0

但是我該如何調試?我在beforeSave – Cbas

+0

之前沒有看到任何來自調試語句的內容您是否使用我提供的代碼?包括'退出;'之後立即?如果你這樣做了,但它仍然沒有顯示,你可能會將調試模式設置爲0(關閉)。 – Dave

+0

是的。調試模式集在哪裏? – Cbas