Невозможно автоматически добавить пользователя в группу в анонимном режиме

Всем привет!

Я использую форум на базе Discourse 2.6.0beta3 и, кажется, обнаружил ошибку.

Я пытаюсь добавить анонимных пользователей в группу с именем anons, чтобы ограничить их публикации в некоторых категориях. Я настроил группу anons так, чтобы она автоматически добавляла пользователей, если их email-домен — anon.mydomain.

Однако, когда я включаю анонимный режим, мой анонимный аккаунт не добавляется в эту группу. Зато если я нажимаю кнопку «Сохранить изменения» на странице /g/anons/manage/membership, мой анонимный аккаунт добавляется в группу. Мне нужно, чтобы анонимный пользователь автоматически добавлялся в эту группу при входе в анонимный режим, без моего участия.

Я искал информацию об этой ошибке, но ничего полезного не нашёл. Спасибо за внимание!

1 лайк

Мне удалось воспроизвести проблему, с которой вы столкнулись, когда пользователь входит в анонимном режиме. Чтобы автоматически добавлять пользователя в группу на основе домена анонимного email, мне приходится переходить на страницу управления анонимной группой и сохранять настройки.

Не уверен, что ожидается работа функции автоматического добавления анонимных пользователей в группу на основе домена их email. Однако понимаю, что это было бы полезно — иметь всех анонимных пользователей в одной группе. Подход с добавлением анонимных пользователей в группу на основе их домена email уже несколько раз предлагался на Meta. Альтернативный вариант — добавить настройку «группа для анонимного режима», которая автоматически добавляла бы всех анонимных пользователей в выбранную группу.

Давайте сначала выясним, планирует ли Discourse поддерживать такую функциональность, прежде чем решать, является ли это ошибкой.

3 лайка

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

Однако я не считаю это ошибкой, поэтому я меняю её категорию.

3 лайка

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

Насколько я понимаю, анонимные пользователи автоматически входят в группу «Все» (everyone). Если бы мы хотели разрешить всему миру публиковать сообщения на форуме, то проблемы с невозможностью публикации анонимов не возникло бы. Однако, поскольку это платный форум, мы установили для группы «Все» права только на чтение, чтобы любой мог читать, но не публиковать.

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

Я полагаю, что функция автоматического добавления анонимных пользователей в группу, возможно, рассматривается как дополнение к Discourse, но пока не реализована. Если это так, существует ли какой-то другой разумный способ настроить мой Discourse для достижения желаемого результата, или мне нужно ждать, пока боги Discourse, надеюсь, добавят эту функцию? Спасибо :slight_smile:

Я написал плагин, который копирует все группы пользователя в его теневой профиль при создании тени:

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

2 лайка

+1 за эту функциональность. Была ли она когда-либо реализована? Я её не вижу. Или, возможно, кто-то знает о плагине, который это делает?

(К сведению: я нашёл это, что кажется приемлемым обходным решением.)

Один из моих пользователей создал плагин для автоматического добавления анонимных аккаунтов в группу форума. Вот мой форк на GitHub, который я использую: GitHub - curi/cf-anon-auto-group: Discourse plugin to trigger `user.set_automatic_groups` for anons on login · GitHub. Он работает стабильно.

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

Возможно, это решение пригодится и другим, или кто-то сможет разработать более официальный плагин или объединить этот код.

Он работает в сочетании с настройкой автоматического добавления в группу по электронной почте (которая в нашем опыте сама по себе не работала):

Кстати, я «решал» эту проблему на уровне базы данных в форуме, который я веду. Используйте этот подход только в том случае, если не удаётся применить другие, более высокоуровневые решения (есть ли какие-то прогресс в этом вопросе или следует пометить один из существующих ответов как «решённый»)? Вот код для PostgreSQL:

create or replace function anon_insert_copy_groups_to_anon_user()
  RETURNS TRIGGER 
  LANGUAGE PLPGSQL
  AS $$
declare
  anon_user_id integer = new.user_id;
  master_user_id integer = new.master_user_id;
  active boolean = new.active;
  created_at timestamp = new.created_at;
  updated_at timestamp = new.updated_at;
BEGIN
  insert into group_users 
        (group_id,                user_id,       created_at,        updated_at,        owner, notification_level,     first_unread_pm_at)
  select group_users.group_id, anon_user_id , current_timestamp, current_timestamp, false, 3 as notification_level, current_timestamp
  from group_users 
  where group_users.user_id=master_user_id
  and   group_users.group_id not in (select group_id from group_users where group_users.user_id=anon_user_id)
  and   group_users.group_id not in (1, 2, 3); -- исключаем администраторов, модераторов и персонал!

  return new;
end;
$$;

-- Создание триггера
CREATE TRIGGER anon_insert_trigger
AFTER INSERT ON anonymous_users
  FOR EACH ROW
    EXECUTE FUNCTION anon_insert_copy_groups_to_anon_user();