2013-04-24 2 views
1

Я пытаюсь настроить проверку для регистрации пользователя, но у меня проблемы. Когда I только имеют поля электронной почты, роли и пароля в массиве $ validation (удалить остальные), он работает и сохранит нового пользователя. Когда я пытаюсь добавить другие поля, они терпят неудачу и выдает сообщение об ошибке «Пользователь не может быть сохранен. Повторите попытку».CakePHP - подтверждение пароля, не позволяющее пользователю регистрироваться

Я уверен, что это проверка re_password. Когда я удаляю валидацию для этого, он работает. Тем не менее, проверка re_password действительно показывает ошибку, когда пароли разные, так что я не знаю, где искать

Вот мой стол пользователи

id | email | password | location | website | role | created | modified 

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

public $validate = array(
    'email' => 'email' 
    , 
    'password' => array(
     'required' => array(
      'rule' => array('minLength', '8'), 
      'message' => 'A password with a minimum length of 8 characters is required' 
     ) 
    ), 
    're_password' => array(
     'required' => array(
      'rule' => array('equalTo', 'password'), 
      'message' => 'Both password fields must be filled out' 
     ) 
    ), 
    'role' => array(
     'valid' => array(
      'rule' => array('inList', array('admin', 'author')), 
      'message' => 'Please enter a valid role', 
      'allowEmpty' => false 
     ) 
    ), 
    'location' => array(
     'valid' => array(
      'rule' => array('notEmpty'), 
      'message' => 'Please select a location' 
     ) 
    ) 
); 

Вот форма (массив опций выше, полагал, что это не нужно, чтобы показать)

echo $this->Form->input('email'); 
    echo $this->Form->input('password'); 
    echo $this->Form->input('re_password', array('type'=>'password', 'label'=>'Re-Enter Password', 'value'=>'', 'autocomplete'=>'off')); 
    echo $this->Form->input('location', array('options' => $options, 'label' => 'Select Nearest Location')); 
    echo $this->Form->input('website',array('label'=>'Enter your website, such as www.example.com. ')); 
    echo $this->Form->input('role', array('type' => 'hidden', 'default' => 'user')); 

Вот re_password функцию в модели пользователя проверки

function check_user_password($userid) { 
    $salt = Configure::read('Security.salt'); 
    $this->User->id = $userid; 
    $hashed_password = $this->User->field('password'); 
    // check password 
    if($hashed_password == md5($data['User']['re_password'].$salt)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

И, наконец, вот функция добавления в UserController

public function add() { 
     if ($this->request->is('post')) { 
      $this->User->create();  //create initiates a form on User/add.ctp 
      if ($this->User->save($this->request->data)) { //save the form data 
       $this->Session->setFlash(__('The user has been saved')); 
       $this->redirect(array('controller' => 'demos', 'action' => 'index')); 
      } else { 
       $this->Session->setFlash(__('The user could not be saved. Please, try again.')); 
      } 
     } 
    } 

Пожалуйста, дайте мне знать, если есть все, что нужно, чтобы увидеть

ответ

4

Я считаю, что ваши re_passwords valiadtion правила equalTo сравнивает его значение строки пароля, а не фактическое поле. Мне нравится использовать для этого пользовательские функции.

так попробуйте заменить re_passwords Правила массива

//'rule' => array('equalTo', 'password'), 
'rule' => array('equalToField', 'password'), 

и объявить функцию equalToField в этой модели

function equalToField($array, $field) { 
    return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0; 
} 

** Кроме того, в будущем, когда вы, кажется, есть проблема с правилами проверок попробовать это в действиях вашего контроллера (его быстрее, чем удаление каждого отдельного правила)

if ($this->User->save($this->request->data)) { 
    ... 
} else { 
    debug($this->User->validationErrors); 
    ... 
} 

Надеюсь, это поможет.

+0

По-прежнему не сэкономить. Я проведу отладку, предложенную позже сегодня. Спасибо за подсказку – user2268281

+0

Добро пожаловать. Однако я просто понял, что вы установили ** user ** в качестве значения по умолчанию для скрытого ввода _role_, но вы пытаетесь проверить его на 'array ('admin', 'author')'. – 2013-04-24 11:46:34

+0

Спасибо, вот и все! Когда я использовал аккуратный трюк отладки, вы просто показали мне, что он описал ошибку aadmin/author, которую вы указали. – user2268281

0

Привет Пожалуйста, используйте следующий код для вашего требования: функции equalTo

переназначения, поставив свой собственный метод в модели пользователя:

function equalTo($field=array(), $compare_field=null) 
{ 
    foreach($field as $key => $value){ 
     $v1 = $value; 
     $v2 = $this->data[$this->name][ $compare_field ]; 
     if($v1 !== $v2) { 
      return FALSE; 
     } else { 
      continue; 
     } 
    } 
    return TRUE; 

} 
0

Внимание, в @luboss ответ, где он заявляет:

function equalToField($array, $field) { 
    return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0; 
} 

Это не работает, поскольку мы сравниваем непоследовательные поля: левый член strcmp уже был хэширован, но не является правильным членом. Это происходит как автоматизация CakePHP, потому что поле называется пароль.

Как я получил это работать было повторно использовать функцию хеширования в помощник equalToField:

public function equalToField($array, $field) { 
    $valueFirstOccurrence = $this->data[$this->alias][$field]; 
    $valueSecondOccurrence = Security::hash($this->data[$this->alias][key($array)], $type = 'sha1', $salt = true) ; 
    return !strcmp($valueFirstOccurrence, $valueSecondOccurrence); 
} 

Другой момент: Если вы заинтересованы в добавлении поля проверки MINLENGTH ваш пароль поле, вы хотите прочитать этот хороший пост первым: minLength data validation is not working with Auth component for CakePHP

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