2010-05-01 2 views
3

Предположим, у меня есть регистрация пользователя, и я использую компонент Auth (/ user/register разрешено, конечно).Проверка данных minLength не работает с компонентом Auth для CakePHP

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

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

+0

Это странно. Правило проверки минимальной длины отлично работает для меня с компонентом Auth. У меня есть два правила проверки для поля пароля: minLength и notEmpty. – bancer

+0

@bancer: Это определенно не было моим опытом. Какую версию тортов вы используете? Как выглядит ваш код проверки? – mikermcneil

+0

@mikermcneil: это был торт 1.2.Часть массива $ валидации: ' 'пароль' => массив ( \t \t \t 'MINLENGTH' => массив ( \t \t \t \t 'правило' => Array ('MINLENGTH', '8') \t \t \t), \t \t \t 'notEmpty' => массив ( \t \t \t \t 'правило' => 'notEmpty', \t \t \t \t 'требуется' => верно \t \t \t) \t \t), \t \t 'confirm_password' => массив ( \t \t \t 'MinLength' => массив ( \t \t \t \t 'правило' => Array ('MinLength', '8') , \t \t \t \t 'требуется' => правда \t \t \t), \t \t \t «notEmp ти»=> массив ( \t \t \t \t 'правило' => 'notEmpty' \t \t \t), \t \t \t 'comparePasswords' => Array ( \t \t \t \t 'правило' => '_comparePasswords'// Защищенная функция ниже \t \t \t), \t \t) '. – bancer

ответ

6

По существу, вам необходимо переименовать поле пароля (например, в «pw»), чтобы компонент Auth не мог хэшировать его автоматически. Затем, если пароль проходит правила проверки, хеш его и сохранить хэш под ключом password. Обычно это делается в обратном вызове beforeFilter(), как описывает this article.

Также возможно проверить данные и ввести пароль в контроллер. Эта практика, как правило, обескуражена, но было бы немного легче обернуть голову, если вы только начинаете с 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

Спасибо, Майк, работает! Но это неудобно для компонента Auth, чтобы сделать это, что мы должны привести к обходным решениям. :( – user295284

+0

Эй, Майк, ссылка, которую вы отправили в эту статью, мертва. Получил другую копию? Спасибо! – mikermcneil

+1

@mikermcneil: Спасибо, что указали это. Я обновил ссылку. – Mike

0

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

Смежные вопросы