И так, что нам для этого понадобится.
1. Необходимо добавить новое поле "IP" в профиль пользователя (administrator\components\com_users\models\user.xml)
<?xml version="1.0" encoding="utf-8"?> <form> <params> <param name="admin_language" type="languages" client="administrator" default="" label="Back-end Language" description="paramAdminLanguage" /> <param name="language" type="languages" client="site" default="" label="Front-end Language" description="paramLanguage" /> <param name="editor" type="editors" default="" label="User Editor" description="WYSIWYG Editor for this User" /> <param name="helpsite" type="helpsites" default="" label="Help Site" description="Help Site for this User" /> <param name="timezone" type="timezones" default="" label="Time Zone" description="Time Zone for this User" /> <param name="ip" type="text" default="" label="IP" description="User IP" /> </params> </form>
2. Отредактировать плагин авторизации (plugins\user\joomla.php)
2.1 Редактируется функция onLoginUser
$users_data = $instance->_params->_registry['_default']['data']; $user_real_ip = $this->get_user_ip(); if ($users_data->ip) { if ($user_real_ip != $users_data->ip) { return JError::raiseWarning('SOME_ERROR_CODE', JText::_('IP не совпадает. Вход запрещен.')); } }
2.2 Добавить функцию корректного получения ip пользователя
function get_user_ip(){ if ( getenv('REMOTE_ADDR') ) $user_ip = getenv('REMOTE_ADDR'); elseif ( getenv('HTTP_FORWARDED_FOR') ) $user_ip = getenv('HTTP_FORWARDED_FOR'); elseif ( getenv('HTTP_X_FORWARDED_FOR') ) $user_ip = getenv('HTTP_X_FORWARDED_FOR'); elseif ( getenv('HTTP_X_COMING_FROM') ) $user_ip = getenv('HTTP_X_COMING_FROM'); elseif ( getenv('HTTP_VIA') ) $user_ip = getenv('HTTP_VIA'); elseif ( getenv('HTTP_XROXY_CONNECTION') ) $user_ip = getenv('HTTP_XROXY_CONNECTION'); elseif ( getenv('HTTP_CLIENT_IP') ) $user_ip = getenv('HTTP_CLIENT_IP'); $user_ip = trim($user_ip); if ( empty($user_ip) ) return false; if ( !preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $user_ip) ) return false; return $user_ip; }
В итоге, что получается? Если у пользователя в профиле заполнено поле ip, то перед тем как его авторизировать, содержимое сверяется с его реальным ip. Если оно совпадает, то пользователь авторизируется, если нет, то выдаётся ошибка.
Скриншоты и отредактированные файлы смотрите ниже.