用户验证通过用户模型在CakePHP中无法正常工作

时间:2011-10-03 10:03:29

标签: php cakephp model cakephp-1.3

出于某种原因,我无法按照我的意愿使用此验证,特别是使用密码minLength字段。

其他一切都很好(甚至用户名的minLength也适用)。出于某种原因,当我在密码字段中添加相同的minLength规则时,它只是忽略它,当我实际输入密码时,它告诉我需要输入密码:

    var $validate = array(
'email' => array(
    'email' => array(
        'rule' => array('email', true),
        'required' => true,
        'allowEmpty' => false,
        'message' => 'Please enter a valid email address'
    ),
    'isUnique' => array(
        'rule' => 'isUnique',
        'message' => 'This email is already in use'
    )
),
'username' => array(
    'notEmpty' => array(
        'rule' => 'notEmpty',
        'required' => true,
        'message' => 'Please enter a valid username'
    ),
    'allowedCharacters' => array(
        'rule' => '/^[a-zA-Z]+[0-9]*$/',
        'message' => 'Please enter a valid username'
    ),
    'minLength' => array(
        'rule' => array('minLength', 3),
        'message' => 'Please enter a longer username'
    ),
    'maxLength' => array(
        'rule' => array('maxLength', 23),
        'message' => 'Please enter a shorter username'
    ),
    'isUnique' => array(
        'rule' => 'isUnique',
        'message' => 'That username is already taken'
    )
),
'password' => array(
    'notEmpty' => array(
        'required' => true,
        'allowEmpty' => false,
        'message' => 'Please enter a password'
    ),
    'minLength' => array(
        'rule' => array('minLength', 4),
        'message' => 'Please enter a longer password'
    ),
     'passwordConfirm' => array(
        'rule' => array('checkPasswords'),
        'message' => 'Passwords must match'

       )
    ),
   );

我是否忽视了一些小事?这让我疯了。

3 个答案:

答案 0 :(得分:5)

这是因为在Cake中,密码字段会在您提交后自动进行哈希处理;这将破坏您的验证规则(5个字符的密码突然变成40+数字哈希)。提出了各种fixes for this problem

听起来最有希望的一个:

创建两个字段,例如pwpw_confirm,而不是passwordconfirm_password。使用这些值进行密码验证(因此,最大长度等)

然后像:

$this->User->set($this->data);
if ($this->User->validates()) {
    // all your data validates, so hash the password submitted,
    // ready for storage as normal.
    $password_hash = $this->Auth->password($this->data['User']['pw'];
    $this->data['User']['password'] = $password_hash;
}

这样,Cake不会自动对输入的传递进行哈希处理 - 允许您的验证按预期运行。

要想象这一点,请将其添加到您的register / add user方法:

function admin_add() {
    if (!empty($this->data)) {
        debug($this->data); 
        exit;

你会得到:

Array
(
    [User] => Array
        (
            [username] => somename
            [password] => 25ae3c1689d26b20e03abc049982349482faa64e
        )

)
验证发生之前

答案 1 :(得分:2)

看起来你的验证数组中有一个小错误。

字段的每次验证都必须有一个“规则”键,并且在“notEmpty”验证中没有。

尝试更新密码验证,如下所示:

<?php
array(
'password' => array(
    'notEmpty' => array(
        'rule' => 'notEmpty',
        'required' => true,
        'allowEmpty' => false,
        'message' => 'Please enter a password'
    ),
    'minLength' => array(
        'rule' => array('minLength', 4),
        'message' => 'Please enter a longer password'
    ),
     'passwordConfirm' => array(
        'rule' => array('checkPasswords'),
        'message' => 'Passwords must match'

       )
))
?>

另请注意,如果您使用的是Auth组件,则在验证密码之前将对其进行哈希处理。这意味着即使您输入一个3个字符的密码,您最终也会得到一个40个字符的哈希值,这显然会验证为比minLength更长。

答案 2 :(得分:0)

使用我的更改密码行为。它在一个干净的地方照顾所有这些东西: http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/

否则你肯定会遇到更多问题 因为您需要丢失密码并更改密码功能。 也许管理员的后端也可以简单地更改密码

和你的问题我已经评论过: “你也应该在这里使用last =&gt; true!否则它没有多大意义” 我相信这也是你问题的一部分。您的所有规则都需要此参数才能使其正常运行。否则错误消息将被关闭。