2013-04-24 100 views
1

我試圖設置用戶註冊的驗證,但我有麻煩。當我只有有美元驗證數組中的電子郵件,角色和密碼字段(刪除其他人)它的作品,並會保存一個新的用戶。當我嘗試添加其他字段時,它會失敗並給出錯誤信息「用戶無法保存,請重試。」CakePHP - 密碼確認不允許用戶提交註冊

我很確定這是re_password檢查。當我刪除驗證它的作品。然而,re_password驗證程序會顯示一個錯誤,當密碼是不同的,所以我不知道去哪裏找

這裏是我的用戶表

id | email | password | location | website | role | created | modified 

這裏的驗證要求。爲了讓它保存一個新用戶,我必須刪除除電子郵件,密碼和角色之外的所有內容。

public $validate = array(
    'email' => 'email' 
    , 
    'password' => array(
     'required' => array(
      'rule' => array('minLength', '8'), 
      'message' => 'A password with a minimum length of 8 characters is required' 
     ) 
    ), 
    're_password' => array(
     'required' => array(
      'rule' => array('equalTo', 'password'), 
      'message' => 'Both password fields must be filled out' 
     ) 
    ), 
    'role' => array(
     'valid' => array(
      'rule' => array('inList', array('admin', 'author')), 
      'message' => 'Please enter a valid role', 
      'allowEmpty' => false 
     ) 
    ), 
    'location' => array(
     'valid' => array(
      'rule' => array('notEmpty'), 
      'message' => 'Please select a location' 
     ) 
    ) 
); 

這裏的形式(選項陣列的正上方,想通它沒有必要顯示)

echo $this->Form->input('email'); 
    echo $this->Form->input('password'); 
    echo $this->Form->input('re_password', array('type'=>'password', 'label'=>'Re-Enter Password', 'value'=>'', 'autocomplete'=>'off')); 
    echo $this->Form->input('location', array('options' => $options, 'label' => 'Select Nearest Location')); 
    echo $this->Form->input('website',array('label'=>'Enter your website, such as www.example.com. ')); 
    echo $this->Form->input('role', array('type' => 'hidden', 'default' => 'user')); 

這裏的re_password檢查在用戶模型函數

function check_user_password($userid) { 
    $salt = Configure::read('Security.salt'); 
    $this->User->id = $userid; 
    $hashed_password = $this->User->field('password'); 
    // check password 
    if($hashed_password == md5($data['User']['re_password'].$salt)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

最後,這裏是用戶控制器中的添加功能

public function add() { 
     if ($this->request->is('post')) { 
      $this->User->create();  //create initiates a form on User/add.ctp 
      if ($this->User->save($this->request->data)) { //save the form data 
       $this->Session->setFlash(__('The user has been saved')); 
       $this->redirect(array('controller' => 'demos', 'action' => 'index')); 
      } else { 
       $this->Session->setFlash(__('The user could not be saved. Please, try again.')); 
      } 
     } 
    } 

請讓我知道是否有其他任何你需要看到

回答

4

我相信你的re_passwords valiadtion排除equalTo其值與字符串密碼而不是實際的領域。我喜歡爲此使用自定義函數。

所以儘量更換re_passwords規則陣列

//'rule' => array('equalTo', 'password'), 
'rule' => array('equalToField', 'password'), 

,並在未來的聲明equalToField功能在該模型中

function equalToField($array, $field) { 
    return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0; 
} 

**此外,當您似乎已經驗證規則 嘗試這是一個問題在你的控制器行動中(它比移除每一條規則更快)

if ($this->User->save($this->request->data)) { 
    ... 
} else { 
    debug($this->User->validationErrors); 
    ... 
} 

我希望這可以幫助。

+0

仍然不會保存。我會檢查你今天晚些時候提出的調試。感謝您的提示 – user2268281 2013-04-24 10:24:21

+0

不客氣。不過,我剛剛意識到,您將** user **設置爲_role_隱藏輸入的默認值,但您正嘗試使用array('admin','author')'來驗證它。 – 2013-04-24 11:46:34

+0

謝謝,就是這樣!當我使用簡潔的調試技巧時,您只是向我展示了它描述了您指出的aadmin/author錯誤。 – user2268281 2013-04-24 20:43:38

0

嗨請使用以下爲您的要求的代碼:通過把用戶模型自己的方法

覆蓋equalTo功能:

function equalTo($field=array(), $compare_field=null) 
{ 
    foreach($field as $key => $value){ 
     $v1 = $value; 
     $v2 = $this->data[$this->name][ $compare_field ]; 
     if($v1 !== $v2) { 
      return FALSE; 
     } else { 
      continue; 
     } 
    } 
    return TRUE; 

} 
0

注意,在@luboss回答,他宣稱:

function equalToField($array, $field) { 
    return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0; 
} 

由於我們比較不一致的字段,所以無法正常工作: strcmp的左側成員已經被散列,但不是正確的成員。 這發生在CakePHP自動化中,因爲該字段被稱爲密碼

我得到這個工作的方式是重用在equalToField幫手散列函數:如果您有興趣加入的minLength驗證字段中輸入密碼 :

public function equalToField($array, $field) { 
    $valueFirstOccurrence = $this->data[$this->alias][$field]; 
    $valueSecondOccurrence = Security::hash($this->data[$this->alias][key($array)], $type = 'sha1', $salt = true) ; 
    return !strcmp($valueFirstOccurrence, $valueSecondOccurrence); 
} 

其他點領域,你想先讀這個好帖子: minLength data validation is not working with Auth component for CakePHP