Проверка данных minLength не работает с компонентом Auth для CakePHP - PullRequest
3 голосов
/ 01 мая 2010

Допустим, у меня есть регистрация пользователя, и я использую компонент Auth (/ user / register разрешен, конечно).

Проблема в том, что если мне нужно установить в модели правило проверки minLength, оно не будет работать, поскольку компонент Auth хэширует пароль, поэтому он всегда больше, чем мой минимальный пароль, и он проходит, даже если он пуст.

Как мне исправить эту проблему? Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 01 мая 2010

По сути, вы должны переименовать поле пароля (например, в «pw»), чтобы компонент Auth не хэшировал его автоматически. Затем, если пароль проходит правила проверки, хэшируйте его и сохраните хеш под ключом password. Обычно это делается в обратном вызове 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;
}
0 голосов
/ 19 августа 2011

хм .. вот что я считаю лучшей практикой: оставьте поле пароля как есть. Включите второе поле пароля «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' => '' для обоих полей паролей.

...