2011-02-15 4 views
1

사용자가 비밀번호를 변경할 수있는 페이지가 있습니다. 양식에는 현재 암호 (old_pass), 새 암호 (pass) 및 새 암호 확인 (pass_confirm)의 세 필드가 들어 있습니다. 문제는 모델 정의에서 필드가 유효하지 않고 빈 필드가 허용되지만 필드가 허용되지 않는다는 것입니다. 이유는 모르겠지만 등록시 비슷한 양식을 가지고 있지만 잘 작동하고이 필드에 대한 유효성 검사 오류를 표시합니다.cakephp가 비밀번호 필드를 확인하지 않음

$this->User->validationErrors을 표시하면 배열이 비어 있습니다. 하지만 유효성 검사가 끝났습니다. 사용자 작성시에만 활성화되는 사용자 이름 유효성 검사가 있으며 User 양식 (thischange 암호 양식 포함)에 대해 활성화하면 유효성 검사 오류가 제대로 표시됩니다.

<?php echo $this->Form->create('User');?> 
    <fieldset> 
     <legend><?php __('Change password'); ?></legend> 
    <?php 
     echo $this->Form->input('User.old_pass', array('type' => 'password', 
      'label' => __('Current password', true))); 
     echo $this->Form->input('User.pass', array('type' => 'password', 
      'label' => __('New password', true))); 
     echo $this->Form->input('User.pass_confirm', array('type' => 'password', 
      'label' => __('Repeat password', true)));   
    ?> 
    </fieldset> 
<?php echo $this->Form->end(__('Submit', true));?> 

이 입력을 할 수있는 뭔가가있는 validate 배열 부분은 다음과 같습니다

'pass' => array(
     'required' => array(
      'rule' => array('custom','/^.*[0-9].*$/i'), 
      'message'=>'Password must contain numbers', 
      'allowEmpty' => false 
     ), 
     'length' => array(
      'rule' => array('minLength',8), 
      'message' => 'Password must be at least 8 characters long') 
    ), 
    'pass_confirm' => array(
     /*'required' => array(
      'rule' => 'notempty', 
      'message' => 'You have to confirm the password', 
      'allowEmpty' => false 
     ),*/ 
     'validate' => array( 
      'rule' => 'validate_password', 
      'message'=>'Your passwords don\'t match!') 
    ), 
    'old_pass' => array(
     'length' => array(
      'rule' => array('minLength',8), 
      'message' => 'Password must be at least 8 characters long'), 
      'allowEmpty' => false 
    ) 

function validate_password(){ 
    //return false; 

    $passed=false; 
    if(isset($this->data['User']['pass_confirm']) && $this->data['User']['pass_confirm']!=''){ 
     if ($this->data['User']['pass'] != $this->data['User']['pass_confirm']){ 
      $this->invalidate('pass'); 
     } else { 
      $passed=true; 
     } 
    } 
    return $passed; 
} 

을, BTW 나는 validate_password 함수에서 return false; 행의 주석을 해제 할 때, 아무 것도 방법이 아닌 그렇게 일어나지 않는다 전혀 불렀다.

사용자를 $this->User->save($data)으로 저장하면 $data 변수에 데이터를 포함하고 있습니다.이 데이터는 프로퍼티 형식으로 저장하고 정상적으로 작동합니다.

function validate_password($check){ 
+0

문제 야? 나는 똑같은 문제를 겪고있다. 이상하게도, 저장 실패 후 컨트롤러의 validationErrors에 대한 디버그 호출을 수행하면 change_password 액션은 저장된 일부 오류가 있음을 보여줍니다. 그러나 여전히 아무것도 형태로 나타나지 않습니다. – tokes

+0

실제로 초를 기다립니다. 'save'를 호출하면 사용자 ID와 전체 암호 만 전달하게됩니다. 당신은'pass'와'pass_confirm'을 패스하지 않습니다. 그것이 왜 아무 것도 입증하지 못하는 이유 일 수 있습니까? – tokes

답변

0

시도 : 유일한 문제는 필드

편집을 검증되지 않는 것입니다? 당신은 우리에게 처리 컨트롤러를 표시해야합니다

내 생각 엔 :

$this->save($this->data, true, FIELDS); 

필드 (비밀번호 입력을 생략 할) 일부 값으로 제한하는 방식으로

:

if (!empty($this->data['User']['pass_confirm'])) { } 

은 여기에 더 짧고 충분합니다.

+0

이것은 아무것도 변경하지 않았고'debug ($ check)'를 시도했을 때 아무 것도 표시되지 않았기 때문에 변수가 비어 있습니다 – Elwhis

0

당신이 필드 PARAM를 사용하십니까 다음 validate_password 메소드에 매개 변수를 추가

function change_password() { 
    $usr = $this->User->find('first', array(
       'conditions'=> array(
        'User.id' => $this->Auth->user('id')), 
       'recursive' => 0 
      )); 

      if ($this->data) { 
       if ($this->Auth->password($this->data['User']['old_pass'])== $usr['User']['password']) { 
        $data = array(
         'id' => $usr['User']['id'], 
         'password' => $this->Auth->password($this->data['User']['pass']) 
        ); 
        if ($this->User->save($data)) { 
         $this->Session->setFlash(__('Password has been changed.', true)); 
        } else { 
         debug($this->User->validationErrors); 

         $this->Session->setFlash(__('Password could not be saved, please try again later.', true)); 
        } 
       } else { 
        $this->Session->setFlash(__('The password you entered as your current is not your current password.', true)); 
       } 
      } 
} 
+0

컨트롤러 메소드가 추가되었습니다. 원래 게시물의 편집 내용을 참조하십시오. – Elwhis

+0

대부분의 문제는 동일하지만, 그건 그렇고. 그게 내가 몇 주 전에 그 문제에 대한 표를 열었던 이유입니다. 이상하게 예기치 않은 행동을 초래할 수있는 모든 규칙에서 "last"=> true를 잊었습니다. – mark

+0

이 해결 되었습니까? 위의 답변 중 하나를 수락하는 것을 고려하십시오. 또한 이것 (1.3 또는 2.x)과 같은 행동을 사용하는 것을 고려하십시오 : http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/ – mark

관련 문제