Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Kohana Model_Auth_User

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Не стоит доверять или как по мне ошибка / недоработка
T1grOK
Отправлено: 17 Ноября, 2013 - 20:54:05
Post Id



Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013  


Помог: 7 раз(а)




Найдено в Kohana 3.3.1 (в предыдущих версиях не проверял).
Модель User как правило расширяется Model_Auth_User.
Для создания пользователя или изменения его данных необходимо использовать исключительно методы create_user и update_user или передавать extra_validation.
Объясню почему.

Есть у нас модель User следующего содержания:
PHP:
скопировать код в буфер обмена
  1.  
  2. class Model_User extends Model_Auth_Users{}
  3.  

В общем то пустая модель. И теперь пытаемся из контроллера, скажем обновить данные пользователя, через метод save класса ORM.
PHP:
скопировать код в буфер обмена
  1.  
  2.   public function action_edit(){
  3.         $id = (int)$this->request->param('id');
  4.         $user = ORM::factory('user', $id);
  5.         if(!$user->loaded()){
  6.             // Ошибка
  7.         }
  8.        
  9.         if($this->request->method() == Request::POST){
  10.               $user->values($this->request->post('user'));
  11.               try{
  12.                   $user->save();  
  13.               }catch (ORM_Validation_Exception $e){
  14.                   $errors = $e->errors('validation');
  15.               }
  16.         }
  17.   }
  18.  

Данный код спокойно отработает, если password(пароль) будет пуст. Но если мы заглянем в Model_Auth_User, то увидим следующие правила
PHP:
скопировать код в буфер обмена
  1. public function rules() {
  2.         return array(
  3.                 'username' => array(
  4.                         array('not_empty'),
  5.                         array('max_length', array(':value', 32)),
  6.                         array(array($this, 'unique'), array('username', ':value')),
  7.                 ),
  8.                 'password' => array(
  9.                         array('not_empty'),
  10.                 ),
  11.                 'email' => array(
  12.                         array('not_empty'),
  13.                         array('email'),
  14.                         array(array($this, 'unique'), array('email', ':value')),
  15.                 ),
  16.         );
  17. }

Здесь мы видим обратное. Пароль должен быть непустым. Забиваем на это и переопределяем этот метод в модели User добавив следующие правила.
PHP:
скопировать код в буфер обмена
  1. class Model_User extends Model_Auth_User{
  2. public function rules() {
  3.         return array(
  4.                 'username' => array(
  5.                         array('not_empty'),
  6.                         array('max_length', array(':value', 32)),
  7.                         array(array($this, 'unique'), array('username', ':value')),
  8.                 ),
  9.                 'password' => array(
  10.                         array('not_empty'),
  11.                         array('min_length', array(':value', 10))
  12.                 ),
  13.                 'email' => array(
  14.                         array('not_empty'),
  15.                         array('email'),
  16.                         array(array($this, 'unique'), array('email', ':value')),
  17.                 ),
  18.         );
  19. }
  20. }

Здесь для пароля добавлено еще одно правило - минимальная длинна 10 символов.
Снова пробуем сохранить данные пользователя с пустым паролем - проходит, вводим пароль 3 символа - проходит, 5 символов проходит. И никакого намека на ошибки.
Идем дальше.

В каком же порядке выполняется процесс валидации в Kohana?!
Сначала выполняются фильтры, а потом совершается непосредственно валидация полей.

Опять идем в Model_Auth_User видим фильтр на поле пароля:
PHP:
скопировать код в буфер обмена
  1. public function filters(){
  2.         return array(
  3.                 'password' => array(
  4.                         array(array(Auth::instance(), 'hash'))
  5.                 )
  6.         );
  7. }

Вот здесь то зарыта собака! Фильтр хеширования выполняется до выполнения правил rules и для пустого или нет пароля возвращается хеш довольно большого размера(зависит от используемого метода хеширования). И соответственно поле окажется непустым и длина его будет достаточной чтобы пройти лимит min_length.

Вывод. Полностью доверять стандартной Model_Auth_User не стоит сохранять данные пользователя стоит через create_user и update_user, подставлять для пароля extra_validation или создать свои способы /методы, которые будут правильно решать данную задачу(например добавить правило, !последним! для поля, именно в rules, который будет выполнять хэш-преобразование).

(Отредактировано автором: 17 Ноября, 2013 - 20:57:07)



-----
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« CMS и фреймворки »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB