2012-04-29 10 views
4

私は、ユーザがパスワードを変更できるページを構築しています。彼らは2つのフィールドを埋める必要があり、両方が一致する必要があります変更する前に、彼らは彼らのプロフィールページに成功するとリダイレクトされます。CakePHP 2.1のユーザのパスワードを変更してください。

は、これまでのところ私は、以下の方法で構築しています:

public function changePassword() 
{ 

    $user = $this->User->find('first', array( 
       'conditions' => array(
        'User.id' => $this->Auth->user('id')) 
      )); 

    if ($this->request->is('post') || $this->request->is('put')) 
    { 
     if ($this->User->save($this->request->data)) 
     { 
      $this->User->saveField('password', AuthComponent::password($this->request->data['User']['password2'])); 

      $this->Session->setFlash(__('Your password has been changed!')); 
      $this->redirect(array('controller'=>'profiles','action'=>'view','userName'=>$user['User']['username'])); 
     } 
     else 
     { 
      $this->Session->setFlash(__('Whoops! Something went wrong... try again?')); 
     } 
    } 

} 

を、これは形式です:だからあなたは計画がパスワード2でそれが言う取り、保存することです見ることができるよう

<?php echo $this->Form->create(); ?> 

    <?php echo $this->Form->input('id',array('type'=>'hidden')); ?> 

    <?php echo $this->Form->input('password1',array('type'=>'text','label'=>array('text'=>'Enter your new password'))); ?> 

    <?php echo $this->Form->input('password2',array('type'=>'text','label'=>array('text'=>'Confirm your new password'))); ?> 

    <button type="submit">Save</button> 

<?php echo $this->Form->end(); ?> 

セキュリティハッシュを使用してデータベースパスワードフィールドに入力します。しかし何が起こるかは、代わりに新しいユーザーを作成することですが、空のデータが...ここで間違っていますか?そして、どのように私は2つのパスワードフィールドを比較しますか?

+0

あなたは行動がそのの世話をさせることができます:http://www.dereuromark.de/2011/08/25/working-with- passwords-in-cakephp/- または、少なくともあなた自身のアプローチに適した解決策を見つけるために提供される機能の一部を取ること。 – mark

+0

なぜ私のコードは新しいユーザーを作成しますか? – Cameron

+0

パスワードフィールドと比較します。 http://stackoverflow.com/questions/17185246/password-confirm-validation-cakephp/18017468#18017468 – Ketan

答えて

1

最も可能性の高い問題は、フォームからIDを何とか失ってコントローラアクションに戻ってしまうことです。 は、データ配列ケーキに存在するidを除いて、エントリを作成する必要があるとみなします。

投稿されたデータをデバッグし、見つからないことを確認してください。保存する前にIDを手動で割り当ててください。

$this->request->data['User']['id'] = $this->Session->read('Auth.User.id'); 

PS:$のユーザデータがコントローラから受け継がれていないとして、あなたの方法を見てから自分の隠された「ID」フィールドは常に空のまま!あなたが要求データをsave()を実行した場合、ケーキは単にあなたのレコードを更新するのではなく、任意のレコードがテーブルにこのidに対して存在する場合(起因するidフィールドを作成し、その認証ユーザーidとフォーム提出するよう

+1

ももたらすであろう形を有する任意の焼戻しを避けるために、ホワイトリスト、またはより良好なセキュリティコンポーネントのフィールドリストを使用セキュリティリスク。 – mark

0
$this->request->data['User']['password2'] = AuthComponent::password($this->request->data['User']['password2']); 

$this->User->save($this->request->data); 

)。上記のコードは、リクエストデータ内のハッシュパスワードでpassword2を更新するだけです。

0

あなたのフォームにアクション編集を指定してはいけませんか?

echo $this->Form->create('User', array('action' => 'edit')); 
1

パブリック関数は、(回復) {

if ($this->request->is('post')) 
    { 
     $this->loadModel('AclManagement.User'); 
     $passwords = AuthComponent::password($this->data['User']['password']); 

     $this->User->query("UPDATE users SET password = '".$passwords."' WHERE password_change = '".$this->request->data['User']['id']."' "); 
     $this->Session->setFlash(__('Password Saved Sucessfully'), 'success'); 
     $this->redirect(array('action' => 'login'));  
    } 
    else 
    { 
     $this->set('resettoken', $_REQUEST['id']); 
    } 
} 
関連する問題