Андрей Осипов Обновлен 4 дня назад в категории CMS Админ. панель 0
Ниже пример доработки контроллера так, чтобы при отправке формы регистрация блокировалась, если e‑mail относится к списку публичных доменов. Мы:
Добавили список запрещённых доменов.
Перед сохранением пользователя проверяем домен e‑mail.
Если домен запрещён — добавляем ошибку к полю e_mail и не выполняем сохранение/автологин.
Сохраняем текущую логику (очистка openpass, рендер шаблона и т.д.).
Код с правками (комментарии меткой // NEW):
<?php
/**
* ReadyScript (http://readyscript.ru)
*
* @copyright Copyright (c) ReadyScript lab. (http://readyscript.ru)
* @license http://readyscript.ru/licenseAgreement/
*/
namespace Users\Controller\Front;
use RS\Application\Auth as AppAuth;
use RS\Controller\Front;
use RS\Helper\Tools as HelperTools;
use RS\Orm\Type;
use RS\Site\Manager as SiteManager;
use Users\Model\Orm\User;
class Register extends Front
{
/** Поля, которые следует ожидать из POST */
public $use_post_keys = ['is_company', 'company', 'company_inn', 'fio', 'name', 'login',
'surname', 'midname', 'phone', 'e_mail', 'openpass', 'openpass_confirm', 'captcha', 'data', 'subscribe_on'];
// NEW: список запрещённых публичных доменов
private array $blocked_public_domains = [
'gmail.com',
'yahoo.com',
'ymail.com',
'rocketmail.com',
'outlook.com',
'hotmail.com',
'live.com',
'msn.com',
'icloud.com',
'me.com',
'mac.com',
'proton.me',
'protonmail.com',
'zoho.com',
'aol.com',
'gmx.com',
'gmx.net',
'email.com',
'consultant.com',
'fastmail.com',
'tutanota.com',
'tuta.com',
'yahoo.co.jp',
'naver.com',
'daum.net',
'outlook.de',
'outlook.fr',
'gmx.de',
'web.de',
'orange.fr',
'laposte.net',
'seznam.cz',
'walla.co.il',
'rediffmail.com',
];
function actionIndex()
{
$this->app->breadcrumbs->addBreadCrumb(t('Регистрация'));
$this->app->title->addSection(t('Регистрация'));
$this->app->meta->addDescriptions(t('На этой странице вы можете зарегистрироваться'));
$referer = $this->url->request('referer', TYPE_STRING, SiteManager::getSite()->getRootUrl());
$referer = HelperTools::cleanOpenRedirect(urldecode($referer));
$user = $this->getUserForRegistration();
if ($this->isMyPost()) {
$user['changepass'] = 1;
// NEW: Валидация домена e-mail перед сохранением
$email = (string) $user['e_mail'];
if ($email !== '') {
$email_domain = strtolower(preg_replace('/^.+@/u', '', $email));
if ($email_domain === '' || $this->isBlockedPublicDomain($email_domain)) {
// Добавляем ошибку к полю e_mail
$user->addError(t('Регистрация с публичными e‑mail доменами запрещена. Укажите корпоративный адрес.'), 'e_mail');
}
} else {
// Пусть встроенные чекеры обработают пустой e-mail, здесь ничего не делаем
}
// Продолжаем только если нет ошибок (включая нашу)
if (!$user->hasError() && $user->save()) {
//Если пользователь уже зарегистрирован
AppAuth::setCurrentUser($user);
if (AppAuth::onSuccessLogin($user)) {
return $this->result
->addSection('closeDialog', true)
->addSection('reloadPage', true)
->setNoAjaxRedirect($referer);
} else {
$user->addError(AppAuth::getError());
}
}
}
//Не передаем пароль в открытом виде в браузер
$user['openpass'] = $user['openpass_confirm'] = '';
$this->view->assign([
'conf_userfields' => $user->getUserFieldsManager(),
'user' => $user,
'referer' => urlencode($referer)
]);
return $this->result->setTemplate('register.tpl');
}
/**
* Возвращает объект пользователя с включенными необходимыми чекерами для валидации при регистрации
*
* @param User $user
* @return User
*/
private function getUserForRegistration()
{
$user = new User();
$user->usePostKeys($this->use_post_keys);
//Включаем капчу
if (!$user['__phone']->isEnabledVerification()) {
$user['__captcha']->setEnable(true);
}
$user->enableOpenPassConfirm();
$user->enableRegistrationCheckers();
return $user;
}
// NEW: проверка домена на запрет
private function isBlockedPublicDomain(string $domain): bool
{
// нормализуем IDN (если в проекте есть утилита для IDN — заменить на неё)
$normalized = strtolower($domain);
// Прямая проверка
if (in_array($normalized, $this->blocked_public_domains, true)) {
return true;
}
// Дополнительно: блокируем субдомены запрещённых доменов (редкий случай, но на всякий)
foreach ($this->blocked_public_domains as $blocked) {
if ($normalized === $blocked) {
return true;
}
if (str_ends_with($normalized, '.' . $blocked)) {
return true;
}
}
return false;
}
}
Комментарии 0
Написать сообщение