【问题标题】:cakephp not validating password fieldscakephp 不验证密码字段
【发布时间】:2011-06-27 16:33:42
【问题描述】:

我有一个用户可以更改密码的页面。该表单包含 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;
}

顺便说一句,当我取消注释 validate_password 函数中的 return false; 行时,什么也没有发生,因此根本不会调用该方法。

我正在使用$this-&gt;User-&gt;save($data) 保存用户,$data 变量包含我想要以适当格式保存的数据并且工作正常。唯一的问题是这些字段没有被验证

编辑:

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

【问题讨论】:

  • 你有没有找到这个问题的原因?我有完全相同的问题。奇怪的是,当我在保存失败后对控制器中的 validationErrors 进行调试调用时,change_password 操作显示保存了一些错误。但是,表单中仍然没有显示任何内容。
  • 其实等一下。当您调用save 时,您只需传入用户的ID 和完整密码。你不要传入passpass_confirm。这可能是它没有针对任何东西进行验证的原因吗?

标签: php validation cakephp passwords cakephp-1.3


【解决方案1】:

你使用字段参数吗?您需要向我们展示控制器的处理方式

我的猜测:

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

FIELDS 仅限于某些值(将省略您的密码输入)

顺便说一句:

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

这里更短,绰绰有余

【讨论】:

  • 顺便说一句,您也遇到了大多数人的问题。这就是为什么我几周前为这个问题开了一张票。您在每条规则中都忘记了“last”=>true,这可能导致奇怪和意外的行为:)
  • 解决了吗?考虑接受上述任何答案。还可以考虑使用像我这样的行为(1.3 或 2.x):dereuromark.de/2011/08/25/working-with-passwords-in-cakephp
【解决方案2】:

尝试在 validate_password 方法中添加一个参数:

function validate_password($check){

【讨论】:

  • 这并没有改变任何东西,当我尝试debug($check) 时,什么都没有显示,所以变量是空的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多