minLength数据验证不适用于CakePHP的Auth组件

时间:2010-05-01 07:25:58

标签: authentication cakephp validation

假设我有一个用户注册,我正在使用Auth组件(当然允许/ user / register)。

问题是如果我需要在模型中设置minLength验证规则,它不起作用,因为Auth组件散列密码因此它总是超过我的minlength密码,即使它是空白也会通过。

如何解决此问题?提前谢谢!

2 个答案:

答案 0 :(得分:6)

实际上,您必须重命名密码字段(例如,“pw”)以防止Auth组件自动散列它。然后,如果密码通过验证规则,则对其进行哈希并将哈希保存在password密钥下。这通常在this article描述的beforeFilter()回调中完成。

还可以验证数据并在控制器中散列密码。通常不鼓励这种做法,但如果你刚刚开始使用CakePHP,可能会更容易理解。

// this code would go after: if (!empty($this->data)  
//               and before: $this->User->save($this->data)

// validate the data
$this->User->set($this->data);
if ($this->User->validates()) {

    // hash the password
    $password_hash = $this->Auth->password($this->data['User']['pw'];
    $this->data['User']['password'] = $password_hash;
}

答案 1 :(得分:0)

嗯..这是我认为的最佳做法:保留密码字段。包含第二个密码字段'pw2',以便用户可以重新输入密码。优点:

  • 防止用户输入错误
  • Auth不会哈希pw2。在模型中,您可以为密码编写自定义验证方法(因为您需要检查2个密码是否相同)
var $validate = array(
  'password' => array(
    'rule' => array('checkPwd')
  )
);
function checkPwd($check) {
  if(!isset($this->data[$this->alias]['password']) || 
     !isset($this->data[$this->alias]['pw2']))
     return 'Where are the passwords?';
  if($this->data[$this->alias]['password'] !== 
    Security::hash($this->data[$this->alias]['pw2'],null,true))
    return 'Passwords are not the same';
  if(strlen($this->data[$this->alias]['pw2']))<10)
    return 'Password not long enough';
  return true;
}

在表单视图中,为两个密码字段设置'value'=&gt;''。