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

+15
2.22K
Доброго всем времени суток!

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

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

Иллюстрация


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

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

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

разбор наших событий
  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. Тут код приводить не буду — кому интересно, глянет в плагине, засорять не буду.

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

  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-го неверного пароля. Количество неверных вводов можете указать в настройках плагина.

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

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

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

Группе, к которой вы принадлежите, запрещено просматривать этот скрытый текст




P.S. ах да, совсем забыл про авторизацию через соцсети — будет обязательно 😊
0
Sonat Sonat 7 лет назад #
Демо не будет посмотреть? На ощупь оно понятнее, как работает zst
+1
Крот Крот 7 лет назад #
будет, в течении часа постараюсь сделать
0
Крот Крот 7 лет назад #
Группе, к которой вы принадлежите, запрещено просматривать этот скрытый текст
0
Sonat Sonat 7 лет назад #
Что-то не так. Провел серию заходов-выходов и обнаружил странность.

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

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

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

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

это раз

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

это два
0
Sonat Sonat 7 лет назад #
Крот:
сделал то же самое, не подтверждается
Похоже не совсем тоже самое, ведь процитировал только 6 пункт, а проявляется только вместе с пятым.

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

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

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

решение - нужно еще дополнительно переделать модуль авторизации и все будет хорошо
0
Крот Крот 7 лет назад #
отделять нужно представление от кода, отделять!
0
Александр Александр 7 лет назад #
+1 жду 3 часть)))
0
Range Range 7 лет назад #
Понравилось решение smile

Еще от автора

Инвайтер 1.9 для 1.10.6
Доброго всем времени суток! Решил нарушить сложившуюся здесь традицию и решил вернуться сюда с обновлениями.
Инстант "по взрослому". Часть 1. Авторизация. Счетчик неверных входов. v1.10
Доброго всем дня! Продолжим наши уроки по усовершенствованию Инстанта. Сегодня мы будем изучать и усовершенствовать первую ветку Инстанта.
Отложенная публикация статьи. Instant 2.01
Доброго всем времени суток!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.