Улучшаем авторизацию в WordPress

Улучшаем авторизацию в WordPress

От автора: В этом уроке мы поработаем с формой авторизации в WordPress. WordPress – это на самом деле замечательная по своей простоте и функциональности CMS. Однако, и в ней есть свои недоработки. Одной из таких недоработок является процесс авторизации в WordPress.

автор

Автор: Андрей Кудлай

Зовут меня Андрей Кудлай. Родом я из Украины, живу в Днепропетровске. Веб-программированию учился сам. Неплохо знаю HTML, CSS, PHP, JavaScript.

скачать исходникискачать урок

Что же именно нас может не устраивать в процессе авторизации в WordPress? Лично мне не нравятся те ошибки, которые WP показывает в после неудачной авторизации. Например, попробуем ввести некорректный логин, после которого мы видим ошибку следующего содержания: ОШИБКА: Неверное имя пользователя.

Если мы попробуем ввести верный логин, но неверный пароль, то увидим уже такое сообщение: ОШИБКА: Введённый вами пароль пользователя admin неверен.

Чем плохи данные ошибки? Тем, что они облегчают работу потенциальному хакеру, который пытается взломать сайт методом подбора пароля. Когда идет подбор, то здесь нужно подобрать не только пароль, но и логин, если он неизвестен. А вот такими вот ошибками, мы прямо подсказываем, что введенный вариант логина неверен, либо же, что вот такой вот логин есть в системе.

Именно поэтому хотелось бы вместо подобных ошибок выводить уже традиционное сообщение вроде: Неверно введен логин или пароль. Такой ошибкой мы уже никак не подсказываем, что же из пары логин/пароль было введено неверно. Давайте попробуем заменить эти ошибки своей.

Для этого мы воспользуемся механизмом хуков WP. Хуки – это специальные функции, которые позволяют нам взаимодействовать с ядром WP в определенные моменты. Например, момент авторизации пользователя. Здесь мы можем воспользоваться специальным хуком, т.е. функцией, которая сработает именно в данный момент. Хук (hook) переводится как «крючок», «зацепка». И мы в буквальном смысле слова можем прицепить к хуку собственную функцию.

Иными словами, мы можем в момент авторизации посмотреть, успешно ли авторизовался пользователь или возникла ошибка. Если есть ошибка, тогда наша функция просто заменит эту ошибку своей. Все достаточно просто.

Итак, для начала воспользуемся хуком login_errors, примеров работы с которым можно найти множество в сети. В файл функций (functions.php) вашей темы добавьте следующий код:

add_filter( 'login_errors', 'my_login_errors' );

function my_login_errors(){
	return "Ошибка!";
}

Давайте его разберем. Итак, для того, чтобы привязать нашу функцию к хуку, мы можем воспользоваться функциями add_filter() или add_action() в зависимости от того, является ли данный хук фильтром или действием.

Функция add_filter() цепляет к фильтру login_errors() нашу функцию my_login_errors(), которая описана ниже. Фильтр login_errors() применяется к ошибкам авторизации, которые выводятся на экран. Соответственно, мы можем просто заменить эти ошибки своей, что мы и делаем, возвращая нужный текст ошибки функцией my_login_errors(). В общем, ничего сложного.

Попробуем авторизоваться теперь. Как видим, на экран сейчас выводится наш текст ошибки и в случае неверного ввода логина, и в случае верного ввода логина. Все вроде бы замечательно. Однако вот незадача: в случае верного ввода логина этот логин запоминается в поле формы для ввода имени пользователя, что дает понять потенциальному взломщику, что логин был введен верно.

Поэтому очевидно, что данный код решил нашу проблему лишь частично. Что же делать? Давайте попробуем воспользоваться другим хуком, который занимается не выводом ошибок на экран, а непосредственно связан с авторизацией и возвратом данных ошибок. Для этого мы воспользуемся фильтром authenticate.

В видео версии урока вы найдете подробное описание работы с данным хуком. Здесь же я приведу сам код и немного прокомментирую работу с ним:

add_filter( 'authenticate', 'my_auth', 20, 3 );

function my_auth($user, $username, $password){
	if( isset( $user->errors['invalid_username'] ) || isset( $user->errors['incorrect_password'] ) ){
		return new WP_Error('broke', '<b>ОШИБКА</b>: неверный логин или пароль');
	}
	return $user;
}

Итак, к фильтру authenticate мы прицепили функцию my_auth(). Также передадим 2 дополнительных параметра. Третий параметр – 20 – отвечает за приоритет выполнения нашей функции (по умолчанию 10). Чем выше приоритет, тем позже функция выполнится. Наша функция должна выполнится позже добавленных к authenticate фильтров, поэтому мы установили приоритет больше 10. Четвертый параметр – 3 – отвечает за количество аргументов, которое будет принимать наша пользовательская функция. Функция my_auth() должна принять именно 3 аргумента, описания которых вы можете найти в документации к хуку authenticate.

Ну и можем проверить наш код. Теперь, даже если мы введем верный логин, но неверный пароль, то логин не будет сохраняться. Ну и при некорректной авторизации мы всегда будем видеть собственный текст ошибки.

На этом я с вами прощаюсь. Удачи и до новых встреч!

Хотите быстро научиться создавать сайты и блоги на WordPress с уникальным дизайном?

Получите самую полную в Рунете бесплатную систему обучения создания сайтов на WordPress “Уникальный сайт с нуля”

Получить

Метки: , ,

Комментарии Вконтакте:

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree