Привет 
Основная причина, по которой я внес эти изменения, — новые законы конкретной страны, влияющие на мой сайт. Мой сайт и его контент доступны только для взрослых от 18 лет. Однако я не хотел нарушать SEO. Поэтому первое, что я придумал, — сделать вход обязательным только для пользователей из определённой страны. Таким образом, Google-бот и другие поисковые системы смогут индексировать сайт в других странах. Полная блокировка входа кажется плохим вариантом, так как это закрывает весь сайт и его содержимое.
Я решил реализовать это на стороне клиента как более подходящий вариант, используя мягкий подход к требованию входа. На данный момент этого достаточно, поэтому я начал с этого.
Я считаю, что не стоит публиковать здесь полный код, который я использую, так как он, вероятно, не подходит для других случаев использования, не является финальной версией и сильно модифицирует систему входа.
Весь процесс теперь работает с помощью двух отдельных компонентов темы, которые в будущем могут быть объединены.
Но перед этим мне пришлось изменить некоторые другие вещи. Во-первых, выбранные боты должны быть исключены из этого процесса и иметь возможность продолжать индексировать сайт. В Discourse есть статическая страница входа, которая активируется, когда включена настройка сайта «Требуется вход». Без этого при переходе на site.com/login вас перенаправит на главную страницу сайта и откроется модальное окно входа. Я отключил эту функцию, чтобы посетители оставались на странице /login. Также мне пришлось изменить несколько других частей в файле JavaScript приложения. Например: canDisplaySidebar() — чтобы скрывать боковую панель для посетителей; loginRequired() — чтобы не требовать настройки сайта и разрешать доступ посетителям; showSiteHeader — чтобы отображать заголовок только тогда, когда это необходимо (он отображается, когда включён соответствующий cookie).
- Первый компонент темы. (Шлюз политики)
Для реализации этого я значительно модифицировал компонент GitHub - discourse/discourse-splash-screen: A welcome splash screen for first time users · GitHub.
Я добавил экран подтверждения возраста (Вам больше 18 лет?) и другую информацию на первом экране.
Если посетитель нажимает Нет, в хранилище ключ-значение добавляется запись, которая удаляет страницу подтверждения возраста и перенаправляет посетителя на статью о том, как зависимости влияют на молодёжь, и почему наш сайт предназначен только для взрослых. Также сохраняется запись в хранилище, чтобы удерживать посетителя на этой странице. Таким образом, запись в хранилище выполняет две функции:
- Она удаляет всю страницу подтверждения возраста, чтобы посетитель не мог изменить свой ответ, если нажал Нет.
- Она всегда перенаправляет его на статью.
Если посетитель нажимает Да, он переходит ко второму экрану, посвящённому информации о cookie. Здесь посетители могут ознакомиться с информацией о cookie, которые мы используем. При нажатии кнопки Хорошо, я понимаю в браузере устанавливается cookie согласия на 1 год. Это важно, потому что мы используем эту часть компонента и для авторизованных пользователей. Они должны подтверждать политику cookie каждый год. Таким образом, cookie согласия выполняет три функции:
- Удаляет страницу cookie.
- Отображает заголовок (в нём содержатся кнопки входа и регистрации).
- Отображает второй компонент и страницу входа.

- Второй компонент темы. (Закрытый сайт)
Этот компонент темы создаёт шаблон страницы входа, похожий на компоненты «Шлюз для гостей» или «Закрытая категория», но он отображается на основе URL и занимает всю страницу. У него есть два параметра:
Разрешённые URL и запрещённые URL.
- Значение разрешённых URL —
*, что означает, что шлюз отображается на всех страницах.
- Значение запрещённых URL — это адреса, где мы не хотим отображать шлюз. Например:
/about, /tos, /faq, /privacy, другие страницы регистрации и т. д.
При отображении происходит автоматическое перенаправление на страницу /login. Я переопределил весь шаблон статической страницы входа своим шаблоном, который включает в себя вход через социальные сети и другие элементы. Компонент не отображается на странице /login.
Вот примерно то, что я сделал для достижения этой цели.