密码确认不允许用户提交注册


CakePHP - Password confirmation not allowing user to submit registration

我正试图为用户注册设置验证,但我遇到了麻烦。当我只有有电子邮件,角色和密码字段在$validation数组(删除其他),它将工作,并将保存一个新用户。当我尝试添加其他字段时,它失败并给出flash消息错误"用户无法保存"。请再试一次。"

我很确定这是re_password检查。当我删除验证,它的工作。但是,当密码不同时,re_password验证确实会显示错误,因此我不确定在哪里查看

这是我的用户表

id  |  email  |  password  |  location  | website  | role  | created |  modified

这是验证需求。为了让它保存一个新用户,我必须删除除电子邮件、密码和角色之外的所有内容。

public $validate = array(
    'email' => 'email'
    ,
    'password' => array(
        'required' => array(
            'rule' => array('minLength', '8'),
            'message' => 'A password with a minimum length of 8 characters is required'
        )
    ),
    're_password' => array(
        'required' => array(
            'rule' => array('equalTo', 'password' ), 
            'message' => 'Both password fields must be filled out'
        )
    ),
    'role' => array(
        'valid' => array(
            'rule' => array('inList', array('admin', 'author')),
            'message' => 'Please enter a valid role',
            'allowEmpty' => false
        )
    ),
     'location' => array(
        'valid' => array(
            'rule' => array('notEmpty'),
            'message' => 'Please select a location'
        )
    )
);

表单如下(选项数组在上面,认为没有必要显示)

    echo $this->Form->input('email');
    echo $this->Form->input('password');
    echo $this->Form->input('re_password', array('type'=>'password', 'label'=>'Re-Enter Password', 'value'=>'', 'autocomplete'=>'off'));
    echo $this->Form->input('location', array('options' => $options, 'label' => 'Select Nearest Location'));
    echo $this->Form->input('website',array('label'=>'Enter your website, such as www.example.com. ')); 
    echo $this->Form->input('role', array('type' => 'hidden', 'default' => 'user'));
以下是User模型中的re_password检查函数
function check_user_password($userid) { 
    $salt = Configure::read('Security.salt');
    $this->User->id = $userid;
    $hashed_password = $this->User->field('password');
    // check password  
    if($hashed_password == md5($data['User']['re_password'].$salt)) {  
        return true;
    } else {
        return false;
    }
}   

最后,这是UsersController

中的add函数
public function add() {  
        if ($this->request->is('post')) {  
            $this->User->create();     //create initiates a form on User/add.ctp
            if ($this->User->save($this->request->data)) {  //save the form data
                $this->Session->setFlash(__('The user has been saved'));
                $this->redirect(array('controller' => 'demos', 'action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }
    }

如果还有什么需要看的请告诉我

我认为您的re_passwords验证规则equalTo将其值与字符串password而不是实际字段进行比较。我喜欢使用自定义函数。

所以尝试替换re_passwords规则数组

 //'rule' => array('equalTo', 'password' ),
'rule' => array('equalToField', 'password'),

并在该模型中声明equalToField函数

function equalToField($array, $field) {
    return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0;
}

**也在将来当你似乎有验证规则的问题在你的控制器操作中试试这个(它比删除每条规则要快)

if ($this->User->save($this->request->data)) {
    ...
} else {
    debug($this->User->validationErrors);
    ...
}

请使用以下代码满足您的要求:

通过在用户模型中放置自己的方法来重写equalTo函数:

function equalTo( $field=array(), $compare_field=null ) 
{
    foreach( $field as $key => $value ){
        $v1 = $value;
        $v2 = $this->data[$this->name][ $compare_field ];
        if($v1 !== $v2) {
            return FALSE;
        } else {
           continue;
        }
    }
    return TRUE;
}

注意,在@luboss的回答中,他声明:

function equalToField($array, $field) {
    return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0;
}

不能工作,因为我们比较不一致的字段:STRCMP的左成员已经被散列了,但右成员还没有。这发生在CakePHP自动化中,因为该字段被称为密码。我让它工作的方式是重用哈希函数在equalToField helper:

public function equalToField($array, $field) {
    $valueFirstOccurrence = $this->data[$this->alias][$field];
    $valueSecondOccurrence = Security::hash($this->data[$this->alias][key($array)], $type = 'sha1', $salt = true) ;
    return !strcmp($valueFirstOccurrence, $valueSecondOccurrence);
}

其他点:如果你有兴趣为你的密码字段添加最小长度验证字段,你想先阅读这篇好文章:CakePHP

的Auth组件不支持minLength数据验证