Используете ли вы 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, вам необходимо изменить его и здесь.
Сказав это, он прозрачно проверяет и выдает правильные сообщения об ошибках как для пароля, так и для полей управления паролем, не требуя никакого дополнительного кода в контроллере.