Проверки аутентификации в Discourse

:discourse2: Краткое описание Плагин Discourse Authentication Validations позволяет добавлять пользовательские проверки к полям пользователя, а также управлять отображением этих полей в модальном окне регистрации.
:hammer_and_wrench: Ссылка на репозиторий https://github.com/discourse/discourse-authentication-validations
:open_book: Руководство по установке Как установить плагины в Discourse

:information_source: О плагине

Плагин Discourse Authentication Validations добавляет возможность настраивать пользовательские проверки для полей пользователя.

Стандартные пользовательские поля не поддерживают тип проверок validation, за исключением проверки на пустое значение для обязательных полей. Этот плагин позволяет задать регулярное выражение (regex) для каждого поля пользователя, которое будет проверяться против введенного значения.

Кроме того, плагин добавляет возможность управлять отображением полей пользователя в модальном окне регистрации. Это позволяет «цеплять» поля друг за друга: поле будет отображаться только если предыдущее поле имеет определенное значение.

:building_construction: Базовая настройка

1. Включение плагина

Плагин Discourse Authentication Validations можно включить либо переключателем, либо через его настройки. Оба варианта доступны на странице admin/plugins.

2. Добавление пользовательской проверки к полю пользователя

После включения плагина Discourse Authentication Validations в форме настройки поля пользователя появится чекбокс Включить пользовательские проверки в нижней части формы.

При его выборе появятся три дополнительных поля:

  1. Регулярное выражение для проверки значения
  2. Значения для отображения
  3. Целевые поля пользователя

:closed_lock_with_key: Добавление пользовательской проверки

Введите корректное регулярное выражение в поле Регулярное выражение для проверки значения:

Значение поля пользователя в форме регистрации теперь будет проверяться на соответствие введенному регулярному выражению. Если введенное значение не соответствует заданным требованиям, форма регистрации не будет отправлена.

Нет значения (используется стандартная проверка формы)

Неверное значение

Верное значение

:link: Цепочка полей пользователя

Сначала укажите значение Значения для отображения для поля пользователя.

Когда для поля пользователя задано значение Значения для отображения, оно отслеживает значение связанного поля ввода до тех пор, пока введенное значение не совпадет с ЛЮБЫМ из указанных Значений для отображения. После этого будет изменена видимость указанных Целевых полей пользователя, сделав их видимыми.

Во-вторых, укажите значение Целевые поля пользователя.

В выпадающем списке Целевые поля пользователя вы увидите список всех доступных полей. Видимость любого выбранного поля будет управляться соответствующими значениями в Значения для отображения.

:hammer_and_wrench: Расширенная цепочка полей

Вы можете создавать цепочки полей, добавляя пользовательские проверки к нескольким полям.

Например, предположим, что у нас есть три поля пользователя со следующими значениями:

Имя Имеет пользовательскую проверку Значения для отображения Целевые поля пользователя
Ввод один true show-field-two Ввод два
Ввод два true show-field-three Ввод три
Ввод три false

Поля «Ввод два» и «Ввод три» будут скрыты по умолчанию, так как они являются «дочерними» по отношению к «Вводу один». Когда к «Вводу один» добавлено значение show-field-two, поле «Ввод два» отобразится, но «Ввод три» останется скрытым. Он останется скрытым до тех пор, пока поле «Ввод два» не получит значение show-field-three.

При правильном сочетании «Значений для отображения» и «Целевых полей» можно бесконечно встраивать поля пользователя друг в друга.

18 лайков

Привет, @isaac.

Мне очень нравится этот плагин, это именно то, что мне нужно! Он всё ещё поддерживается? У меня возникли проблемы с функциональностью «цепочки».

Я следовал примеру выше, используя:

Но по умолчанию отображаются все поля… Прошу прощения, если я что-то упустил в описании!

1 лайк

Приношу извинения за это — плагин работает. Однако он не работает, если вы переходите по ссылке для регистрации по приглашению. Он работает, если вы используете публичную страницу регистрации.

Было бы здорово добавить возможность работы логики как для приглашений, так и для публичной регистрации!

Отличная работа с плагином!

6 лайков

Я полностью согласен. @tobiaseigen, если мы решим внедрить этот плагин как функцию более широко, нам нужно будет обеспечить работу логики в обоих случаях (публичная регистрация/по приглашению), как указал @kravitsjacob.

3 лайка

Привет @isaac. Ещё раз спасибо за этот потрясающий плагин — он действительно открыл для меня множество возможностей в Discourse.

Я столкнулся с небольшой ошибкой: ответы на вопросы сохраняются, даже если вопрос скрыт. Это привело к нескольким нежелательным ситуациям, когда пользователи отправляют ответы, которые на самом деле быть не должны (именно поэтому мы изначально хотели скрыть эти вопросы). Такое поведение также вызывает ещё одну проблему: когда вопрос двойной вложенности, он всё равно отображается, даже если родительский ответ был снят с выбора (потому что система всё ещё считает, что триггерный ответ выбран). Я понимаю, что это описание довольно размытое, поэтому вот GIF, демонстрирующий эту проблему:

auth null bug

Я думаю, что желаемым исправлением было бы сбрасывать ответы на значение null, как только они становятся невидимыми. Это также могло бы быть опциональным поведением, настраиваемым тем, кто создаёт форму — я могу представить разные подходы к тому, должны ли ответы сохраняться при переходе по таким веткам.

Не могли бы вы реализовать это? :pray:

5 лайков

Спасибо за подробный ответ! Я посмотрю на это на следующей неделе :slight_smile:

4 лайка

Сегодня у меня была возможность взглянуть на эти вопросы :slight_smile:

Пожалуйста, прочитайте описание PR для деталей!

3 лайка

В настоящее время невозможно сделать поле одновременно опциональным и обязательным.

У меня есть поле «Отрасль», и при выборе значения «Другое» раскрывается поле «Другая отрасль».

Однако, если я сделаю поле «Другая отрасль» обязательным, я не смогу отправить форму, когда это поле скрыто.

Когда я вручную раскрываю div, видно, что поле требует ввода, даже несмотря на то, что форма скрыта.

Если я выберу «Другое», заполню поле значением, а затем выберу другую отрасль, чтобы поле снова скрылось, я смогу отправить форму. При этом возникает та же ситуация, на которую указал @kravitsjacob: значение поля «Другая отрасль» сохраняется в профиле пользователя, даже если поле «Отрасль» не установлено в значение «Другое».

Пользователь Admin:

3 лайка

Привет, @RGJ, удалось ли тебе решить проблему с обязательными полями? У меня возникла та же проблема.
@isaac, есть ли какое-то обходное решение для этого? У меня есть поля, которые должны быть обязательными, но условие для их отображения уже выполнено.

1 лайк

Нет, я не получил ответа по этому вопросу и сам не тратил на это время.

@RGJ, спасибо за быстрый ответ.
Я только что создал PR в оригинальный репозиторий с исправлением, которое должно решить проблему.

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

Надеюсь, это поможет кому-то в будущем.

1 лайк

Я добавил дополнительный PR, который внедряет логику условных полей для каждого значения поля, а не одно значение на каждое поле. Это означает, что вы можете скрывать и отображать разные поля в зависимости от различных значений выбранного поля.

Также добавлена предварительная демонстрация того, как данные будут храниться в базе данных для нового столбца, использующего тип JSONB.

2 лайка

Как это влияет на поисковые поля?

Пользовательское поле, установленное как поисковое, не отображается в меню конфигурации на странице каталога пользователей моего сайта, но вместо него появляются три условных поля, ссылающихся на него. Эти три поля сами по себе не установлены как поисковые.

Привет! Извините, я пока не знаком со всей логикой Discourse, касающейся пользовательских полей, поэтому не уверен, что правильно понял ваш вопрос.

Насколько я знаю, опция «Searchable» (Искать) помечает поле для индексации и позволяет использовать его в других частях портала, но я ещё не работал с этим и не уверен, как правильно настроить эту функцию.

Теоретически условные поля не должны влиять на поля с опцией «Searchable» каким-либо образом, и при использовании автодополнения для вставки значения логика должна продолжать работать, так как вы присваиваете значение элементу UserField.

Возможно, вы могли бы добавить больше деталей к вашему вопросу или прикрепить несколько скриншотов — это могло бы помочь.

Возможно, я не был достаточно ясен: мой вопрос адресован автору темы (OP) и касается плагина в целом. Извините, если это вызвало путаницу.

Остальная логика плагина работает корректно, однако у меня есть три поля, которые отображаются только при выборе верхнего поля на первом скриншоте ниже. В конфигурации пользовательского каталога показываются только эти три зависимых поля, а не исходное поле, которое должно быть доступным для поиска:

Скриншоты


1 лайк

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