[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Kohana Model_Auth_User
T1grOK
Найдено в Kohana 3.3.1 (в предыдущих версиях не проверял).
Модель 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
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.