2010-11-14 2 views
1

Есть некоторые проблемы проверки, которые появляются только при использовании компонента Auth. У меня 4 поля в моей регистрационной форме: username, password, password_confirm и email.Ошибка проверки компонентов компонента CakePHP

У меня также есть многозначное поведение, связанное с моей моделью пользователя. Вот правила, которые применяются к регистрационной форме:

var $validationSets=array(
    "register" => array(
     "username" => array(
      "usernameFieldNotEmpty" => array(
       "rule" => "notEmpty", 
       "message" => "You did not enter the username!" 
      ), 
      "usernameValid" => array(
       "rule" => "__alphaNumericDashUnderscore", 
       "message" => "The username you entered is not valid!" 
      ), 
      "usernameExistsInDatabase" => array(
       "rule" => array("__existingRecord", false), 
       "message" => "The username you entered has been already registered in our database!" 
      ) 
     ), 
     "password" => array(
      "passwordFieldNotEmpty" => array(
       "rule" => "notEmpty", 
       "message" => "You did not enter your password!" 
      ) 
     ), 
     "password_confirm" => array(
      "passwordConfirmFieldNotEmpty" => array(
       "rule" => "notEmpty", 
       "message" => "You did not confirm your password!" 
      ), 
      "passwordsMatch" => array(
       "rule" => array("__fieldMatch", "password"), 
       "message" => "The passwords you entered don't match!" 
      ) 
     ), 
     "email" => array(
      "emailFieldNotEmpty" => array(
       "rule" => "notEmpty", 
       "message" => "You did not enter the e-mail!" 
      ), 
      "emailValid" => array(
       "rule" => "email", 
       "message" => "The e-mail you entered is not valid!" 
      ), 
      "emailExistsInDatabase" => array(
       "rule" => array("__existingRecord", false), 
       "message" => "The e-mail you entered has been already registered in our database!" 
      ) 
     ) 
     /*"language" => array(

     )*/ 
    ) 

Вот моя форма регистра:

<?php echo $this->Form->create('User', array('url' => array('controller' => 'users', 'action' => 'register')));?> 
<fieldset> 
    <legend><?php __('Add User'); ?></legend> 
<?php 
    echo $this->Form->input('username'); 
    echo $this->Form->input('password', array('type' => 'password', 'value' => ''));//value='' - resets the password input on any error on the page 
    echo $this->Form->input('password_confirm', array('type' => 'password', 'value' => '')); 
    echo $this->Form->input('email'); 
?> 
</fieldset> 
<?php echo $this->Form->end(__('Submit', true));?> 

Теперь, каждый раз, когда я отправить форму EMPTY, поле пароля, хотя пустой, проходит все проверки тесты (я поставил в код value => '', но это бесполезно). Кроме того, ввод электронной почты, кажется, проходит тест 'notEmpty' и ошибка показала, что The email is not valid

Я просмотрел весь мой код, но не смог найти какое-либо решение.

+0

как вы проверяете пароли друг против друга? –

+0

поле пароля, используемое с auth, никогда не будет пустым, все, что вы хотите сделать, - проверить, что поле compare_pw действительно, и хешированная версия соответствует полю пароля. вы правильно говорите, что ваше решение - это взломать. вы можете сравнить, например, return security :: hash ($ this-> data ['User'] ['compare'], null, true) === $ this-> data ['User'] ['password']; – dogmatic69

+0

Вот что я сделал. На самом деле, моя проблема вошла в контроллер, как я могу «сбросить» поле пароля. Я понял это в «редактировании» ниже. Но вместо Security :: hash() я использовал $ this-> Auth-> password(), чтобы быть в тональности с компонентом Auth ... :) Также важно отметить, что поле 'password' будет быть хэшированным ТОЛЬКО, когда у вас также есть поле «имя пользователя» в форме. В противном случае он останется открытым текстом. – linkyndy

ответ

0

Мне удалось сделать пару «хаков», поэтому проблема решена пока. Не думайте, что это самый подходящий способ сделать это, но это может пригодиться другим пользователям, имеющим мою проблему:

Во-первых, в моем UserController я написал этот фрагмент, поэтому, если поле пароля осталось пусто пользователем, сбросьте его '' Перед проверкой:

if($this->data['User']['password'] == $this->Auth->password('')){ 
      $this->data['User']['password'] = ''; 
     } 
     $this->User->set($this->data); 
     if($this->User->validates()){ //post validation login } 

Вторая проблема была проверка электронной почты. Как ни странно, у меня эта проблема исправлена ​​в , меняя порядок правил в Multivalidatable Behavior. Так, из:

"email" => array(
     "emailFieldNotEmpty" => array(
      "rule" => "notEmpty", 
      "message" => "You did not enter the e-mail!" 
     ), 
     "emailValid" => array(
      "rule" => "email", 
      "message" => "The e-mail you entered is not valid!" 
     ), 
     "emailExistsInDatabase" => array(
      "rule" => array("__existingRecord", false), 
      "message" => "The e-mail you entered has been already registered in our database!" 
     ) 
    ) 

теперь у меня есть:

"email" => array(
      "emailExistsInDatabase" => array(
       "rule" => array("__existingRecord", false), 
       "message" => "The e-mail you entered has been already registered in our database!" 
      ), 
      "emailValid" => array(
       "rule" => "email", 
       "message" => "The e-mail you entered is not valid!" 
      ), 
      "emailFieldNotEmpty" => array(
       "rule" => "notEmpty", 
       "message" => "You did not enter the e-mail!" 
      ) 
     ) 

Я не знаю, было ли это намеренно или нет, но мне кажется, как последний правило, которое не выполняется является один отображается. По моей логике правила были бы упорядочены в порядке их появления, поэтому, если первый не применяется, прекратите проверять и отображать его.

Повторяю, я не знаю, правильно ли это, но я, похоже, разработал эти проблемы.

Если у вас есть что добавить, пожалуйста, сделайте это!

EDIT Нашел «официальное» объяснение в книге «Торт 1.3».Он говорит:

By default CakePHP tries to validate a field using all the validation rules declared for it and returns the error message for the last failing rule. But if the key last is set to true for a rule and it fails, then the error message for that rule is returned and further rules are not validated. So if you prefer to show the error message for the first failing rule then set 'last' => true for each rule. 

Таким образом, другой подход к моей проблеме, чтобы установить правила проверки в порядке их появления и добавьте last ключ массива правил.

+1

Я бы рекомендовал использовать встроенное правило isUnique для правила проверки подлинности emailExistsInDatabase. –

+0

Интересно, почему это не попалось мне в голову ... Спасибо! (+1 для полезного предложения) – linkyndy

+0

также вместо вызова набора, а затем проверяет и затем сохраняет, просто вызовите save(), как если бы ($ this-> Model-> save ($ this-> data)) {// yes} else {// no} – dogmatic69

0

http://pastebin.com/xnQ02BCW

это то, что я хотел бы использовать.

+0

Спасибо за ваш ответ, но это не совсем то, что я искал. Правила валидации хорошо написаны, поскольку все они работают правильно, когда я отключу компонент Auth. Основная проблема заключается в том, что поле пароля всегда имеет значение, даже когда я оставляю его пустым. Кроме того, проверка подлинности электронной почты не работает совершенно правильно: она передает условие notEmpty, даже когда я оставляю ее пустой. Надеюсь, теперь вы лучше поняли, какие у меня проблемы :) – linkyndy

+0

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

+0

Я с нетерпением жду вашего ответа. Благодаря! – linkyndy

0

О проблеме с паролем: какую версию CakePHP вы используете?

Компонент Auth в 1.2 автоматически генерирует ваш пароль, поэтому он не будет пустым, даже если он есть. В 1.3 это должно быть хорошо, но я не знаю, из какой версии.

+0

Я использую 1.3, и он все еще хэширует его. Я поместил 'value = ''' в представление, которое сортирует поле, но проверка еще продолжается, хотя я оставил поле пустым. – linkyndy

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