CakePHP не проверяет и не хэширует мой пароль перед сохранением

#php #cakephp

#php #cakephp

Вопрос:

это отлично работает для моего действия «зарегистрироваться», но не работает для моего действия «Забыть пароль».

Проверка NotEmpty работает для обоих, но моя пользовательская проверка соответствия значений в password и confirm password не работает с моим «forgetPassword», но она работает с моим действием «register».

Вот фрагмент кода проверки подлинности из моей модели

         'confirm_password' => array(
            'confirm password field cannot be empty' => array(
                'rule' => 'notEmpty',
                'message' => 'This field cannot be left empty'
            ),

            'confirm password must match password' => array(
                'rule' => 'matchPassword',
                'message' => 'The two passwords do not match'

            )

        ),
  

и вот другие методы в моей модели

     public function matchPassword($check){
        if(strcmp($this->data['User']['password'],$this->data['User']['confirm_password']) != 0){
            $this->invalidate('password','The two password do not match');
            return false;
        }
        return true;
    }

    public function beforeSave($options = array()){
        if(!$this->id){
            $passwordHasher = new SimplePasswordHasher();
            $this->data['User']['password'] = $passwordHasher->hash($this->data['User']['password']);
        }
        return true;
    }
  

и мой forget_password.ctp

 <h1>Enter Your New Password</h1>
<?php echo $this->Form->create(); ?>
<?php echo $this->Form->input('password'); ?>
<?php echo $this->Form->input('confirm_password', array('type' => 'password','label' => 'Type again')); ?>          
<?php echo $this->Form->submit('Change', array('class' =>'button')); ?>
<?php echo $this->Form->end(); ?>
  

И вот метод обновления пароля, который я использую в контроллере для обновления пароля

     protected function _updatePassword($id,$password){
        $this->User->id = $id;
        $this->User->data['User']['password'] = $password;
        if($this->User->save($this->User->data,false)){
            return true;
        } else{
            return false;
        }
    }
  

Обновление: Вместо того, чтобы делать
$password = $this->request->data['User']['password'];

а затем передает этот $ password в качестве аргумента _updatePassword($id, $ password), чтобы использовать его как $this->User->data['User']['password'] = $password;
$this->user->save($this->User->data);

теперь я делаю $this->User->save($this->request->data); , и проверка работает. Но проблема с хэшем пароля все еще существует.

Обновление 2:

Даже я удалил это if(!$this->id){ , это не работало. итак, я использовал что-то подобное в своем контроллере

         if($this->request->is('post')){
            $this->User->id = $id;
            $passwordHasher = new SimplePasswordHasher();
            if(isset($this->request->data['User']['password']) and isset($this->request->data['User']['confirm_password'])){
                $this->request->data['User']['password'] = $passwordHasher->hash($this->request->data['User']['password']);
                $this->request->data['User']['confirm_password'] = $passwordHasher->hash($this->request->data['User']['confirm_password']);
            }
            if($this->User->save($this->request->data)){
  

Для выполнения задачи.

Комментарии:

1. Вы устанавливаете validate = false в вашем all значение $this->User->save (второй параметр).

2. @Holt, о, прости. Я не знал, что второй параметр предназначен для отключения проверки. Я просто взял этот шаблон из поиска Google по serveral issues и никогда не понимал, что это для отключения проверки. Спасибо. Редактировать: нет, я удалил это ‘false’ из моего второго параметра, но он все еще не проверяется. Кстати, как насчет проблемы с паролем?

3. Я даже изменил второй параметр на true, и это не сработало.

4. Я не понимаю, почему вы передаете пароль в качестве вторых параметров своей функции, а затем выполняете $this->User->data['User']['password'] = $password; ?

5. @Holt Хорошо, проверка теперь работает. Смотрите мое обновление. Но проблема с хэшем пароля все еще существует.