Инстант "по взрослому". Часть 2. Авторизация. Аякс. v1.10

1591
Доброго всем времени суток!

Продолжая серию Инстант "по взрослому", сегодня хотел бы показать более мощный плагин авторизации.
Как мы уже выяснили в первой части, авторизация не защищена от подбора пароля пользователя, будь хоть он суперадмин сайта. Даже если мы поставим запись логов от Fuze, то вся информация будет только после в логах. Нам же нужно как то реагировать на действия злоумышленников, и при этом не создавать трудностей простым пользователям.

И тут на помощь нам приходит технология "аякс", давайте попробуем применить его "волшебные свойства"




Итак, плагин p_realauth, возьмем за источник наш предыдущий плагин, и добавим в него ajax-функционал метода(экшена) auth компонента registration. Это позволит нам немного ускорить работу с сайтом пользователя, убрать дурацкоене очень фунциональное сообщение об ошибке с 5-ти секундной задержкой а так же позволит получать капчу через аякс автоматически созданные картинки для прохождения теста Тьюринга передаваемые через асинхронные запросы в ходе обмена данными между сервером и браузером. smile

Чтобы нам не "хакать" систему для привязки плагина, поменяем html код входа на сайт прямо на клиенте, с помощью javascript.

Соответственно, добавим еще два события, первый для получения капчи с сервера, второй - для запуска работы нашего плагина. Т.е. если нам плагин вдруг не нужен - мы его выключаем и все работает по старому.

разбор наших событий
Код PHP:
  1. public function execute($event='', $data=array()){
  2.  
  3. parent::execute();
  4.  
  5. switch ($event){
  6. case 'GET_ROUTE_REGISTRATION': $data = $this->eventGetRoutes($data); break;
  7. case 'GET_REGISTRATION_ACTION_AUTH': $data = $this->eventAuth(); break;
  8. case 'REALAUTH_START': $data = $this->eventStartPlugin(); break;
  9. case 'GET_REGISTRATION_ACTION_SHOW_CAPTCHA': $data = $this->eventCaptcha(); break;
  10. case 'USER_LOGIN': $this->eventUserLogin($data); break;
  11. }
  12. return $data;
  13.  
  14. }
  15.  
Обработка события GET_REGISTRATION_ACTION_AUTH - это взятая обработка из стандартной поставки Инстанта с выводом текста через ajax. Тут код приводить не буду - кому интересно, глянет в плагине, засорять не буду.

Код вывода капчи -

Код PHP:
  1. // вывод в шаблон com_registration_login функционала запроса Капчи
  2. // добавьте туда {php}cmsCore::callEvent('REALAUTH_START', array());{/php}
  3. // пока не будет добавлено функционал не заработает
  4. private function eventCaptcha() {
  5.  
  6. $inCore = cmsCore::getInstance();
  7.  
  8. // для 1.10.4 тут надо cmsPage::initTemplate
  9. $smarty= $this->inCore->initSmarty('plugins', 'p_captcha.tpl');
  10. $smarty->display('p_captcha.tpl');
  11.  
  12. if (cmsCore::isAjax())
  13. cmsCore::jsonOutput(array('html' => ob_get_clean()));
  14.  
  15. }
  16.  
как написано в комментариях к коду для 1.10.4 нужно поменять вызов, и вообще уже сегодня увидел, что капчу можно просить у CMS напрямую, без кучи вызовов смарти, плагинов того же смарти. Вообщем есть что еще поменять.

Остальной код не так интересен как бы хотелось, расскажу о функционале

Работает следующим образом - если вы неверно ввели пароль для пользователя 3 раза - после третьего ввода пароля "вылезет" блок с капчой (или капчей ???). После верного ввода, сбросит счетчик и так опять до 3-го неверного пароля. Количество неверных вводов можете указать в настройках плагина.

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

Все эти минусы будут поправлены в окончательной третьей версии плагина, буду сам использовать на всех своих сайтах и с вами поделюсь (если Fuze капчу не прибьет в следующих версиях). Но пока капча есть - будет польза от плагина.
Также будет возможность использовать этот функционал в модуле(окне).

Забираем, смотрим плагин (предыдущий можно удалить)

Скрытый текст виден только зарегистрированным пользователям




P.S. ах да, совсем забыл про авторизацию через соцсети - будет обязательно smile
Инстант "по взрослому". Часть 1. Авторизация. Счетчик неверных входов. v1.10 | Инвайтер 1.9 для 1.10.6
Комментарии (10)
Sonat 14 июля 2014 в 19:40 0
Демо не будет посмотреть? На ощупь оно понятнее, как работает zst
Крот 14 июля 2014 в 20:56 +1
будет, в течении часа постараюсь сделать
Крот 14 июля 2014 в 21:38 0
Скрытый текст виден только зарегистрированным пользователям
Sonat 14 июля 2014 в 22:06 0
Что-то не так. Провел серию заходов-выходов и обнаружил странность.

В буфер скопировал пароль 7 знаков "123456 " - седьмой знак пробел,

1 - вставляю из буфера в поле пароль (вижу что звёздочек 7) и прохожу авторизацию
2 - выхожу
3 - вставляю из буфера тоже самое удаляю последний символ пароля (вижу что звездочек 6) и тоже прохожу авторизацию.
4 - выхожу
5 - набираю с морды заведомо неверный пароль, грит неверный и выкидывает на аторизацию
6 - вставляю из буфера пароль (тот что ранее проходил) Результат - "Неверные логин или пароль:Неверно указан код на картинке!
хотя пароль был верный и кода никакого мне не показывалось.
Крот 14 июля 2014 в 22:41 0
ну во первых в CMS неверно то что крайние пробелы в пароле удаляются...

public static function strClear($input, $strip_tags=true){

................
$string = trim((string)$input);
................

это раз

6 - вставляю из буфера пароль (тот что ранее проходил) Результат - "Неверные логин или пароль:Неверно указан код на картинке
сделал то же самое, не подтверждается
похоже кто-то еще вместе с вами его залочил)
сделаю на основе сессий - там можно будет уже точно сказать, а сейчас такой проблемы (кроме пробела в пароле) пока не вижу

это два
Sonat 14 июля 2014 в 23:19 0
Крот:
сделал то же самое, не подтверждается
Похоже не совсем тоже самое, ведь процитировал только 6 пункт, а проявляется только вместе с пятым.

Только что еще раз проверил:
- ввожу неверный пароль на морде (http://realauth.instantdemo.ru)
= "ошибка авторизации"

- перекидывает на http://realauth.instantdemo.ru/login, никакой капчи тут пока нет.

- ввожу тут верные логин пароль
= "Неверные логин или пароль:Неверно указан код на картинке!"
хотя логин и пароль были верны, а никакого кода не показывалось.
Крот 14 июля 2014 в 23:29 0
понял, ключевое слово "с морды"
1) перекидывает на /auth/error.html адрес точно сейчас не помню - вот там то и выставляется признак капчи(странно да?)
2) потом заходим /login - а там мой плагин и не подозревает о "наглости" модуля
3) получаем результат: система ждет капчу - а компонент не показывает

решение - нужно еще дополнительно переделать модуль авторизации и все будет хорошо
Крот 14 июля 2014 в 23:30 0
отделять нужно представление от кода, отделять!
Александр 19 июля 2014 в 18:50 0
+1 жду 3 часть)))
Range 26 июля 2014 в 13:20 0
Понравилось решение smile