2011-02-15 6 views
1

ユーザーがパスワードを変更できるページがあります。このフォームには、現在のパスワード(old_pass)、新しいパスワード(pass)、新しいパスワード確認(pass_confirm)の3つのフィールドがあります。問題は、フィールドが検証されず、モデル定義で禁止されているにもかかわらず空白のフィールドが許可されるということです。私はなぜ、私は登録にシンプルな形を持っているが、1つはうまく動作し、これらのフィールドの検証エラーを表示する理由は知らない。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; 
} 

をところで、私はvalidate_password機能でreturn false;行のコメントを解除したときに、何も方法がないので、起こりませんすべてで呼ばれる。

私は$this->User->save($data)でユーザーを保存していますが、$data変数には、プロパー形式で保存したいデータが含まれています。

function validate_password($check){ 
+0

あなたはこれまでに問題ですか?私はまったく同じ問題を抱えています。不思議なことに、保存が失敗した後にコントローラのvalidationErrorsでデバッグコールを実行すると、change_passwordアクションによっていくつかのエラーが保存されていることが示されます。しかし、まだ、何もフォームに表示されません。 – tokes

+0

実際には1秒待ってください。 'save'を呼び出すと、ユーザーのIDと完全なパスワードだけが渡されます。あなたは 'pass'と' pass_confirm'を渡しません。それが何かに対して妥当性を確認していないのはなぜですか? – tokes

答えて

0

試してみてください。唯一の問題は、フィールドが

EDITを検証されていないということでしょうか?

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

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

関連する問題