2011-10-27 8 views
0

CakePHP 1.3アプリケーションでトークンを使用し、ユーザーがパスワードを変更できる以下の機能があります。パスワードが実際に変更されないことを除いて、すべてうまくいくようです:/問題が何であるか?CakePHPパスワードリセットでパスワードを変更しない

function admin_changepassword ($token = null) 
    { 
     // If has a token or form has been submitted 
     if (!empty($token) || !(empty($this->data))) 
     { 
      $user = $this->User->find('first',array("MD5(User.email + '".Configure::read('Security.salt')."')"=>$token)); 

      if (empty($user)) 
      { 
       $this->redirect(array('admin'=>false,'controller'=>'pages','action'=>'display','home')); 
       $this->Session->setFlash('Invalid token'); 
      } 
      else 
      { 
       $this->set('user',$user); 
       if (!empty($this->data['User']['password'])) 
       { 
        $user['User']['password'] = $this->data['User']['password']; 
        $this->User->save($this->data); 
        $this->Session->setFlash('Your password has been changed! Please log in.'); 
        $this->redirect(array('admin'=>true,'controller' => 'users', 'action' => 'login')); 
       } 
      } 
     } 
     else 
     { 
      $this->redirect(array('admin'=>false,'controller'=>'home','action'=>'display','home')); 
      $this->Session->setFlash('No token'); 
     } 
    } 
+0

あなたは、そのクエリとの比較のために潜在的に巨大に無駄な操作をすべてのユーザーのすべての単一のパスワードをハッシュするデータベースを求めているに役立つかもしれません。 – deceze

+0

私は理解していないので、これをさらに説明できますか?パスワードが変更されない理由は? – Cameron

+0

あなたは 'どこMD5(パスワード...)= 'somestring''を照会しています。つまり、データベースはすべての行で 'MD5(password ...)'を実行し、 'somestring 'と比較する必要があります。とにかくこのトークンは何であるはずですか?私はそれがあなたの問題だとは思わない。 *あなたの問題は何ですか?それは何をするためのものか? – deceze

答えて

1

個人的に私はこのようなことをします。私はあなたのユーザーがauthコンポーネントまたは類似のものを使って実際にログインしていると仮定しています。テストされていない。しかし、それは私にはうまくいくはずのような論理があります。

<?php 
function admin_changepassword ($token = NULL) { 
    // bail out early if there is no token set, and always set the flash before redirecting. 
    if($token==NULL) { 
     $this->Session->setFlash('No token'); 
     $this->redirect(array('admin'=>false,'controller'=>'home','action'=>'display','home')); 
    } 

    // this is an admin action; the user already be logged in right? 
    $this->User->id = $this->Auth->user('id'); 
    $user_password = $this->User->field('password'); 

    // does the token match the hashed password, and did they enter a new password? 
    if($token==md5($user_password . Configure::read('Security.salt')) && !empty($this->data['User']['password'])) { 
     $this->User->saveField('password', $this->data['User']['password']);  
     $this->Session->setFlash('Your password has been changed! Please log in.'); 
     $this->redirect(array('admin'=>true,'controller' => 'users', 'action' => 'login')); 
    } 

    // somethings gone wrong/password was not updated 
    $this->Session->setFlash('Your password was not changed.'); 
    $this->redirect(array('admin'=>false,'controller'=>'home','action'=>'display','home')); 
} 
+0

パスワードを忘れてしまったので、ユーザーはログインしていませんでした。ユーザーは管理者です! – Cameron

+0

しかし、私のコードでは、ビューにHelloメールアドレスメッセージを表示しているので、パスワードを変更していないことを知っているので、私のユーザは間違いなく知っています。/ – Cameron

+0

また、 'change password'は' forgetgot'とは異なります。意味論的な理由からのみ、メソッドの名前を変更することを検討したいことがあります。変更は、ユーザーがログインしていて、パスワードを新しいものに変更したいことを意味します。私はあなたのユーザーがログインしていると仮定しました。 – Ross

1

いくつかのテストでは、問題は私のコメントで最初に示唆したとおりです。

あなたはそう、あなたのユーザーのidを設定されていません。

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

は、それはあなたのデータベースに新しい行を追加して、パスワードを更新していません。

更新するユーザーのIDを指定する必要があります。

$user = $this->User->find('first',array("MD5(User.email + 
          '".Configure::read('Security.salt')."')"=>$token)); 

// this line is redundant 
$user['User']['password'] = $this->data['User']['password']; 


$this->User->id = $user['User']['id']; // set user id 
$this->User->save($this->data); // save it 

あなたusersテーブルをチェックした場合、私はあなたが「変更」パスワードを使用して、空のレコードがたくさんあるでしょう疑い。私のテストはケーキのマニュアルに同意します。

0

これは古いスレッドですが、それは誰か

function changePwd(){ 
    $this->User->id = $this->data->['User']['id']; //assuming this is set 
    //check if the password fields are empty 
    //check if the password fields match (password and confirm password one) 

    //convert password 
    $this->request->data['User']['password'] = $this->Auth->password($this->data['User']['password']); 

    //saveField worked for me 
    if($this->User->saveField('password',$this->request->data['User']['password'])){ 
     $this->Session->setFlash('Password changed successfully.','flashSuccess'); 
    }else{ .... 
} 
関連する問題