Инстант "по взрослому". Часть 1. Авторизация. Счетчик неверных входов. v1.10

1119
Доброго всем дня!

Продолжим наши уроки по усовершенствованию Инстанта. Сегодня мы будем изучать и усовершенствовать первую ветку Инстанта. Вторую пока трогать не будем. И будем делать все по взрослому smile
Итак, как я уже писал для многоуважаемого Fuze, одним из неудобств (и даже проблем) первого Инстанта является её система авторизации. Как вы заметили несколько версий назад появилась следующая фича - если вы ошибаетесь со вводом пароля, на следующем разе CMS предлагает вам ввести капчу. Этого сделано для того, чтобы хакер(скорее крякер) не "крякнул" пароль пользователя CMS простым перебором.
Вот об этом и поговорим на этом и следующем уроке.



Итак, я хочу (да и много где пишут об этом различные уважаемые и вежливые человеки) сделать следующую вещь - чтобы капча появилась только на третий неправильный ввод пароля. Мне лично очень не нравится писать капчу, когда я ошибся паролем. "Хакать" систему мы не будем, мы сделаем плагин, который это все и будет делать.
Итак, что нам нужно
1) увеличить на 1 счетчик неверных вводов если пароль неверный
2) если счетчик больше указанного числа (это кто-то подбирает, точно, точно) - вывести капчу
3) если пароль введен верно - сбросить счетчик

В Инстанте 1.10.x появилась замечательная возможность заменить экшен (action) компонента или выполнить какие-то действия перед этим экшеном. Вот этим мы у будем пользоваться. Взяв как пример встроенный плагин P_DEMO_ROUTE и посмотрев как работает вызов экшена в ядре приходим к следующему выводу.
Наш плагин, пусть он называется p_authcnt будет обрабатывать всего два события:

USER_LOGIN - который вызывается после успешной авторизации
GET_REGISTRATION_ACTION_AUTH - экшен AUTH компонента REGISTRATION - как раз он обрабатывает вход и перед его вызовом мы и будем воплощать свои фантазии. Заменять нам его не нужно, нам только нужно направить его работу в нужное нам русло.

Итак добавим в наш плагин строки

$this->events[] = 'GET_REGISTRATION_ACTION_AUTH';
$this->events[] = 'USER_LOGIN';

и конфиг по умолчанию:

$this->config['P_BADAUTHCOUNT'] = 3;

это три неверных ввода

Далее при установке плагина добавим поле в таблицу cms_users для подсчета входов
это кусочек из метода install()

Код PHP:
  1.  
  2.  
  3. if (!$inDB->isFieldExists('cms_users', 'authcnt')){
  4.  
  5. $inDB->query("ALTER TABLE `cms_users` ADD `authcnt` INT DEFAULT 0");
  6.  
Так начнем с простого чтобы нам сбросить счетчик при верном входе напишем обработчик события USER_LOGIN


Код PHP:
  1.  
  2. private function eventUserLogin($user) {
  3.  
  4. $inCore = cmsCore::getInstance();
  5. $inDB = cmsDatabase::getInstance();
  6.  
  7. $inDB->query("UPDATE cms_users SET authcnt = 0 WHERE id = '{$user['id']}'");
  8. }
  9.  
И сразу приведу код метода события GET_REGISTRATION_ACTION_AUTH

Код PHP:
  1. private function eventAuth() {
  2.  
  3. if( !cmsCore::inRequest('logout') ) {
  4.  
  5. $inCore = cmsCore::getInstance();
  6. $inDB = cmsDatabase::getInstance();
  7.  
  8. $antibruteforce = cmsUser::sessionGet('anti_brute_force');
  9.  
  10. $login = cmsCore::request('login', 'str', '');
  11. $passw = cmsCore::request('pass', 'str', '');
  12.  
  13. if ($login=="") {
  14. $login = cmsUser::sessionGet('login','user');
  15.  
  16. }
  17.  
  18. // логин или почта?
  19. if (!$login || !$passw){
  20. if (!preg_match("/^([a-zA-Z0-9\._-]+)@([a-zA-Z0-9\._-]+)\.([a-zA-Z]{2,4})$/ui", $login)
    Отложенная публикация статьи. Instant 2.01 | Инстант "по взрослому". Часть 2. Авторизация. Аякс. v1.10
Комментарии (7)
Крот 12 июля 2014 в 11:40 +3
Уважаемые админы - если я оборачиваю полный код плагина в <CODE - /CODE> - инстант ломается тут
поправьте пжл.
lokanaft 12 июля 2014 в 21:55 0
Слишком много символов становится и пост обрезает
Raiden 12 июля 2014 в 12:34 0
Спасибо, довольно подробно разжёвано)
""
Александр 12 июля 2014 в 22:18 0
Круто, а он будет работать с новым плагинов Fuz'a который ведет логи авторизаций?
Крот 13 июля 2014 в 17:13 +1
Да спасибо, а почему бы и нет?

P.S. честно, я не проверял на совместимость
Александр 13 июля 2014 в 18:21 0
Как думаете, а на 1.0.4 в последствии он пойдет или нет? а так за плагин +++
Крот 14 июля 2014 в 17:26 0
да, должен, вот следующий плагин - будет ругаться но не смертельно...