CakePHP не проверяет поля пароля - PullRequest
1 голос
/ 15 февраля 2011

У меня есть страница, где пользователь может изменить свой пароль. Форма содержит 3 поля: текущий пароль (old_pass), новый пароль (pass) и подтверждение нового пароля (pass_confirm). Проблема в том, что поля не проверены, и пустые поля разрешены, хотя это запрещено в определении модели. Я понятия не имею, почему, у меня есть похожая форма при регистрации, но она отлично работает и отображает ошибки проверки для этих полей.

Когда я отображаю $this->User->validationErrors, массив пуст. Но проверка выполнена, у меня есть проверка имени пользователя, которая активна только при создании пользователя, и когда я активирую ее для всех форм User (включая форму смены пароля), ошибка проверки отображается здесь в основном.

<?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;
}

Кстати, когда я раскомментирую строку return false; в функции validate_password, ничего не происходит, поэтому метод вообще не вызывается.

Я сохраняю пользователя с помощью $this->User->save($data), переменная $data содержит данные, которые я хочу сохранить в формате propper, и работает нормально. Единственная проблема в том, что поля не проверяются

EDIT:

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));
                }
            }
}

Ответы [ 2 ]

0 голосов
/ 16 февраля 2011

Вы используете param полей?Вам нужно будет показать нам контроллер, обрабатывающий

мое предположение:

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

ПОЛЯ ограничена только некоторыми значениями (которые не будут вводить ваш пароль)путь:

if ( !empty($this->data['User']['pass_confirm']) ) { }

короче и более чем достаточно здесь

0 голосов
/ 15 февраля 2011

Попробуйте добавить параметр в метод validate_password:

function validate_password($check){
...