У меня есть конкретный сценарий использования, и я хотел бы узнать, есть ли более простой способ его реализации.
Не у всех наших пользователей (через наш SSO) есть активные аккаунты на форуме.
Нам регулярно нужно добавлять пользователей в группу форума для доступа к закрытому разделу.
Наличие активных аккаунтов на форуме у пользователей неизвестно до попытки добавления их в группу.
Например:
Каждый месяц сотрудник получает список из 100+ аккаунтов, которые имеют право на доступ к закрытому форуму. У этих аккаунтов есть имена пользователей SSO и адреса электронной почты, но у них может еще не быть аккаунта на форуме.
Есть ли простой способ добавить людей в группу, если у них уже есть аккаунты на форуме, и пригласить их на форум (автоматически добавляя в группу), если у них их нет?
На странице «Группы» кнопка Добавить участников позволяет вставить список имен пользователей через запятую. Если имена действительны, пользователи будут добавлены в группу. Если имя недействительно (то есть аккаунта на форуме еще нет), операция завершится ошибкой, и они не будут добавлены.
Кроме как вручную просматривать список успешно добавленных пользователей, выявлять, какие имена не были добавлены, а затем отправлять этим людям приглашения на форум (например, (Superseded) Multiple Use Invite Links), — существует ли простой способ объединить приглашение и добавление в группу для смешанного списка текущих и потенциальных пользователей форума?
Вы рассматривали возможность добавления пользователей в группы Discourse с помощью параметров SSO add_groups и remove_groups? Для пользователей, которые существуют на вашем сайте-провайдере SSO, вы можете создать для них учётные записи в Discourse и добавить их в группы Discourse, выполнив вызов API к маршруту sync_sso. Некоторые подробности настройки этого процесса можно найти здесь: Синхронизация данных пользователя SSO через маршрут sync_sso. Мы можем предоставить более подробную информацию о настройке, если этот подход кажется вам подходящим.
Все наши пользователи существуют на сайте SSO (они являются продавцами на наших маркетплейсах), но только их часть создаёт аккаунты в Discourse для использования наших форумов. Этот SSO охватывает как покупателей, так и продавцов: мы не хотим автоматически создавать аккаунты в Discourse для всех покупателей (их слишком много!), но создание аккаунтов для всех продавцов значительно упростило бы задачу.
В данном случае нам нужно предоставлять доступ к закрытым группам форума только конкретным продавцам, когда они начинают использовать определённые маркетплейсы или услуги.
Например: продавец на Маркетплейсе 1 имеет аккаунт SSO. На этом этапе он может создать аккаунт в Discourse, войдя на форумы.
Позже этот продавец получает доступ к Маркетплейсу 2, и его аккаунт SSO фиксирует это изменение. У нас есть пользовательская группа (и закрытая категория форума) для этого маркетплейса.
Если к этому моменту у него уже есть аккаунт в Discourse, нам нужно обновить его группы, чтобы он мог видеть закрытую область форума.
Если у него ещё нет аккаунта в Discourse, мы хотели бы создать его для него с соответствующими группами.
Команда в настоящее время использует функцию «добавить в группу» с перечислением имён пользователей через запятую. Если у пользователя уже есть аккаунт в Discourse, он получает доступ к группе… если его ещё нет на форумах, ничего не происходит.
Чтобы охватить пользователей, которые создали свои аккаунты в Discourse после последнего добавления пакета в группу, команда обычно включает все подходящие имена пользователей за последние X месяцев при попытке обновить членство в группе, что является довольно громоздким процессом.
Если вы сделаете вызов API к маршруту sync_sso, включив параметр SSO add_groups, существующие пользователи будут добавлены в группу. Если у пользователя ещё нет учётной записи Discourse, для него будет создана учётная запись, и он будет добавлен в группу. Аналогичным образом вы можете использовать параметр SSO remove_groups для удаления пользователей из групп. Ещё одним преимуществом использования маршрута sync_sso для этой задачи является то, что пользователю не нужно выходить из системы и снова входить в Discourse, чтобы изменения вступили в силу.
Если вашему проекту будет полезно ознакомиться с примером кода на PHP/WordPress, вы можете увидеть реализацию здесь: https://github.com/discourse/wp-discourse/blob/master/lib/utilities.php#L378. Файл, на который я дал ссылку, содержит некоторые вспомогательные функции, которые сайты могут использовать для расширения плагина WP Discourse. Именно поэтому в нём используются статические функции.