проверка пароля cakephp

var $validate = array( 'password' => array( 'passwordlength' => array('rule' => array('between', 8, 50),'message' => 'Enter 8-50 chars'), 'passwordequal' => array('checkpasswords','message' => 'Passwords dont match') ) ); function checkpasswords() { return strcmp($this->data['Airline']['password'],$this->data['Airline']['confirm password']); } 

Этот код не работает и всегда выдает сообщение об ошибке, даже если они совпадают. Также, когда я делаю редактирование, я получаю следующую ошибку, так как нет поля пароля. есть ли какое-либо исправление

 Undefined index: password [APP/models/airline.php, line 25] 

Вы используете AuthComponent? Имейте в виду, что он хэширует все входящие поля пароля (но не поля подтверждения пароля), проверьте с помощью debug($this->data) ), поэтому поля никогда не будут одинаковыми. Прочтите руководство и используйте AuthComponent::password для проверки.


Сказав это, я кое-что использую:

 public $validate = array( 'password' => array( 'confirm' => array( 'rule' => array('password', 'password_control', 'confirm'), 'message' => 'Repeat password', 'last' => true ), 'length' => array( 'rule' => array('password', 'password_control', 'length'), 'message' => 'At least 6 characters' ) ), 'password_control' => array( 'notempty' => array( 'rule' => array('notEmpty'), 'allowEmpty' => false, 'message' => 'Repeat password' ) ) ); public function password($data, $controlField, $test) { if (!isset($this->data[$this->alias][$controlField])) { trigger_error('Password control field not set.'); return false; } $field = key($data); $password = current($data); $controlPassword = $this->data[$this->alias][$controlField]; switch ($test) { case 'confirm' : if ($password !== Security::hash($controlPassword, null, true)) { $this->invalidate($controlField, 'Repeat password'); return false; } return true; case 'length' : return strlen($controlPassword) >= 6; default : trigger_error("Unknown password test '$test'."); } } 

Это плохо по следующим причинам:

  • Обладает жесткой связью с формой, всегда ожидает наличия поля password_control . Вам нужно использовать «белый список» или отключить проверку, если у вас его нет, то есть: $this->User->save($this->data, true, array('field1', 'field2')) ,
  • Вручную хэширует пароль так, как делает AuthComponent (поскольку нет чистого доступа к компонентам из модели). Если вы измените алгоритм, используемый в AuthComponent, вам также нужно изменить его здесь.

Сказав это, он прозрачно проверяет и создает правильные сообщения об ошибках как для полей управления паролем и паролем, не требуя дополнительного кода в контроллере.

вот ошибка

 'passwordequal' => array('checkpasswords','message' => 'Passwords dont match') 

Я изменил его на

 'passwordequal' => array('rule' =>'checkpasswords','message' => 'Passwords dont match') 

также функция strcmp также имела ошибки, так как она возвращала 0 (т.е. False) все время в приведенном выше коде

 if(strcmp($this->data['Airline']['password'],$this->data['Airline']['confirm_password']) ==0 ) { return true; } return false; 

Для подтверждения пароля, старого пароля и подтверждения пароля

 class Adminpassword extends AppModel { public $name = 'Admin'; public $primaryKey = 'id'; public $validate = array( 'oldpassword' => array( array( 'rule' => 'notEmpty', 'required' => true, 'message' => 'Please Enter Current password' ), array( 'rule' =>'checkcurrentpasswords', 'message' => 'Current Password does not match' ) ), 'password' => array( array( 'rule' => 'notEmpty', 'required' => true, 'message' => 'Please Enter password' ), array( 'rule' => array('minLength', 6), 'message' => 'Passwords must be at least 6 characters long.', ) ), 'cpassword' => array( array( 'rule' => 'notEmpty', 'required' => true, 'message' => 'Please Enter Confirm password' ), array( 'rule' => 'checkpasswords', 'required' => true, 'message' => 'Password & Confirm Password must be match.' ) ) ); function checkpasswords() // to check pasword and confirm password { if(strcmp($this->data['Adminpassword']['password'],$this->data['Adminpassword']['cpassword']) == 0 ) { return true; } return false; } function checkcurrentpasswords() // to check current password { $this->id = $this->data['Adminpassword']['id']; $user_data = $this->field('password'); //print_r(Security::hash($this->data['Adminpassword']['oldpassword'], 'sha1', true)); if ($user_data == (Security::hash($this->data['Adminpassword']['oldpassword'], 'sha1', true))) { return true; } else { return false; } } } 

Для пользователей CakePHP 2.x, использующих аутентификацию, вы можете заметить, что «AuthComponent больше не автоматически хэширует каждый пароль, который он может найти». Т.е. вышеприведенные решения не могут быть правильным способом решения задачи для 2.x. http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#hashing-passwords

Heres – мое решение:

Вы должны сделать метод с именем match (вы можете назвать его как хотите):

 public function match($check, $with) { // Getting the keys of the parent field foreach ($check as $k => $v) { $$k = $v; } // Removing blank fields $check = trim($$k); $with = trim($this->data[$this->name][$with]); // If both arent empty we compare and return true or false if (!empty($check) && !empty($with)) { return $check == $with; } // Return false, some fields is empty return false; } 

Метод $ validate должен быть таким:

 public $validate = array( 'password' => array( 'match' => array( 'rule' => array('match', 'password2'), 'message' => 'Passwords doesnt match', ), ), ); 

Где password2 – поле для сравнения вашего первого поля password

Я рад поделиться им! : D

Будет ли это помогать: http://sumanrs.wordpress.com/2011/10/01/cakephp-user-password-manager-authentication-missing-guide/ ? Это должно позаботиться о проверке пароля.