Требуется вход в зависимости от страны

Привет :waving_hand:

Я ищу способ обязать пользователей входить в систему в зависимости от страны. Я нашел этот плагин Geo Blocking plugin, который, вероятно, наиболее близок к моему сценарию использования, но Ruby сейчас пока вне моей компетенции… хотя бы пока. Мне кажется, что этот плагин можно модифицировать, чтобы реализовать возможность требовать вход в систему для конкретных стран и перенаправлять пользователей на /login.

Спасибо за любые советы! :slightly_smiling_face:

Привет :waving_hand:

Основная причина, по которой я внес эти изменения, — новые законы конкретной страны, влияющие на мой сайт. Мой сайт и его контент доступны только для взрослых от 18 лет. Однако я не хотел нарушать SEO. Поэтому первое, что я придумал, — сделать вход обязательным только для пользователей из определённой страны. Таким образом, Google-бот и другие поисковые системы смогут индексировать сайт в других странах. Полная блокировка входа кажется плохим вариантом, так как это закрывает весь сайт и его содержимое.

Я решил реализовать это на стороне клиента как более подходящий вариант, используя мягкий подход к требованию входа. На данный момент этого достаточно, поэтому я начал с этого.

:warning: Я считаю, что не стоит публиковать здесь полный код, который я использую, так как он, вероятно, не подходит для других случаев использования, не является финальной версией и сильно модифицирует систему входа.


Весь процесс теперь работает с помощью двух отдельных компонентов темы, которые в будущем могут быть объединены.

Но перед этим мне пришлось изменить некоторые другие вещи. Во-первых, выбранные боты должны быть исключены из этого процесса и иметь возможность продолжать индексировать сайт. В Discourse есть статическая страница входа, которая активируется, когда включена настройка сайта «Требуется вход». Без этого при переходе на site.com/login вас перенаправит на главную страницу сайта и откроется модальное окно входа. Я отключил эту функцию, чтобы посетители оставались на странице /login. Также мне пришлось изменить несколько других частей в файле JavaScript приложения. Например: canDisplaySidebar() — чтобы скрывать боковую панель для посетителей; loginRequired() — чтобы не требовать настройки сайта и разрешать доступ посетителям; showSiteHeader — чтобы отображать заголовок только тогда, когда это необходимо (он отображается, когда включён соответствующий cookie).

  1. Первый компонент темы. (Шлюз политики)

Для реализации этого я значительно модифицировал компонент GitHub - discourse/discourse-splash-screen: A welcome splash screen for first time users · GitHub.

Я добавил экран подтверждения возраста (Вам больше 18 лет?) и другую информацию на первом экране.

Если посетитель нажимает Нет, в хранилище ключ-значение добавляется запись, которая удаляет страницу подтверждения возраста и перенаправляет посетителя на статью о том, как зависимости влияют на молодёжь, и почему наш сайт предназначен только для взрослых. Также сохраняется запись в хранилище, чтобы удерживать посетителя на этой странице. Таким образом, запись в хранилище выполняет две функции:

  1. Она удаляет всю страницу подтверждения возраста, чтобы посетитель не мог изменить свой ответ, если нажал Нет.
  2. Она всегда перенаправляет его на статью.

Если посетитель нажимает Да, он переходит ко второму экрану, посвящённому информации о cookie. Здесь посетители могут ознакомиться с информацией о cookie, которые мы используем. При нажатии кнопки Хорошо, я понимаю в браузере устанавливается cookie согласия на 1 год. Это важно, потому что мы используем эту часть компонента и для авторизованных пользователей. Они должны подтверждать политику cookie каждый год. Таким образом, cookie согласия выполняет три функции:

  1. Удаляет страницу cookie.
  2. Отображает заголовок (в нём содержатся кнопки входа и регистрации).
  3. Отображает второй компонент и страницу входа. :arrow_down_small:

  1. Второй компонент темы. (Закрытый сайт)

Этот компонент темы создаёт шаблон страницы входа, похожий на компоненты «Шлюз для гостей» или «Закрытая категория», но он отображается на основе URL и занимает всю страницу. У него есть два параметра:

Разрешённые URL и запрещённые URL.

  1. Значение разрешённых URL — *, что означает, что шлюз отображается на всех страницах.
  2. Значение запрещённых URL — это адреса, где мы не хотим отображать шлюз. Например: /about, /tos, /faq, /privacy, другие страницы регистрации и т. д.

При отображении происходит автоматическое перенаправление на страницу /login. Я переопределил весь шаблон статической страницы входа своим шаблоном, который включает в себя вход через социальные сети и другие элементы. Компонент не отображается на странице /login.


Вот примерно то, что я сделал для достижения этой цели.

Очень интересно, Дон! Спасибо за подробности. :+1: