Хорошо, после некоторого тестирования, ваша проблема, как я изначально предложил в своем комментарии.
Вы не устанавливаете id
вашего пользователя, поэтому:
$this->User->save($this->data);
не обновляет пароль, он добавляет новую строку в вашу базу данных.
Вам необходимо указать идентификатор пользователя для обновления.
$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
таблицу. Я подозреваю, что вы найдете много пустых записей с «измененным» паролем.Мое тестирование согласуется с руководством по торту.