Модель User как правило расширяется Model_Auth_User.
Для создания пользователя или изменения его данных необходимо использовать исключительно методы create_user и update_user или передавать extra_validation.
Объясню почему.
Есть у нас модель User следующего содержания:
class Model_User extends Model_Auth_Users{}
В общем то пустая модель. И теперь пытаемся из контроллера, скажем обновить данные пользователя, через метод save класса ORM.
public function action_edit(){
$id = (int)$this->request->param('id');
$user = ORM::factory('user', $id);
if(!$user->loaded()){
// Ошибка
}
if($this->request->method() == Request::POST){
$user->values($this->request->post('user'));
try{
$user->save();
}catch (ORM_Validation_Exception $e){
$errors = $e->errors('validation');
}
}
}
Данный код спокойно отработает, если password(пароль) будет пуст. Но если мы заглянем в Model_Auth_User, то увидим следующие правила
public function rules() {
return array(
'username' => array(
array('not_empty'),
array('max_length', array(':value', 32)),
array(array($this, 'unique'), array('username', ':value')),
),
'password' => array(
array('not_empty'),
),
'email' => array(
array('not_empty'),
array('email'),
array(array($this, 'unique'), array('email', ':value')),
),
);
}
Здесь мы видим обратное. Пароль должен быть непустым. Забиваем на это и переопределяем этот метод в модели User добавив следующие правила.
class Model_User extends Model_Auth_User{
public function rules() {
return array(
'username' => array(
array('not_empty'),
array('max_length', array(':value', 32)),
array(array($this, 'unique'), array('username', ':value')),
),
'password' => array(
array('not_empty'),
array('min_length', array(':value', 10))
),
'email' => array(
array('not_empty'),
array('email'),
array(array($this, 'unique'), array('email', ':value')),
),
);
}
}
Здесь для пароля добавлено еще одно правило - минимальная длинна 10 символов.
Снова пробуем сохранить данные пользователя с пустым паролем - проходит, вводим пароль 3 символа - проходит, 5 символов проходит. И никакого намека на ошибки.
Идем дальше.
В каком же порядке выполняется процесс валидации в Kohana?!
Сначала выполняются фильтры, а потом совершается непосредственно валидация полей.
Опять идем в Model_Auth_User видим фильтр на поле пароля:
public function filters(){
return array(
'password' => array(
array(array(Auth::instance(), 'hash'))
)
);
}
Вот здесь то зарыта собака! Фильтр хеширования выполняется до выполнения правил rules и для пустого или нет пароля возвращается хеш довольно большого размера(зависит от используемого метода хеширования). И соответственно поле окажется непустым и длина его будет достаточной чтобы пройти лимит min_length.
Вывод. Полностью доверять стандартной Model_Auth_User не стоит сохранять данные пользователя стоит через create_user и update_user, подставлять для пароля extra_validation или создать свои способы /методы, которые будут правильно решать данную задачу(например добавить правило, !последним! для поля, именно в rules, который будет выполнять хэш-преобразование).
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api