И так, что нам для этого понадобится.
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. Если оно совпадает, то пользователь авторизируется, если нет, то выдаётся ошибка.
Скриншоты и отредактированные файлы смотрите ниже.
