无法以匿名模式自动将用户添加到群组

大家好!

我在使用 Discourse 2.6.0beta3 运行一个论坛,发现了一个疑似 bug。

我尝试将匿名用户添加到名为 anons 的群组中,以便限制他们在某些特定类别中的发帖权限。我将 anons 群组设置为根据邮箱域名 anon.mydomain 自动添加用户。

当我进入匿名模式时,发现我的匿名账户并未被添加到该群组。然而,如果我在 /g/anons/manage/membership 页面点击“保存更改”按钮,我的匿名账户就会被添加到该群组。我希望在进入匿名模式时自动将匿名用户加入该群组,而无需手动点击。

我已经搜索过这个 bug,但没有找到有用的信息。感谢阅读!

1 个赞

当用户进入匿名模式时,我可以复现您所遇到的问题。若要基于匿名邮箱域名自动将用户添加到某个组,我目前需要进入该匿名组的管理页面并保存设置。

我不确定基于匿名邮箱域名将匿名用户添加到组是否是预期行为。不过,我理解将所有匿名用户归入一个组会很有用。通过邮箱域名将匿名用户添加到组的方法在 Meta 上已被多次提出。另一种方案是添加一个“匿名模式组”设置,自动将所有匿名用户加入指定的组。

让我们先确认 Discourse 是否计划支持此功能,再判断这是否属于缺陷。

3 个赞

我认为依赖匿名邮箱来实现此功能存在风险。我们可以考虑为匿名用户创建另一个自动分组,并自动将他们加入其中。

不过,我并不认为这是一个漏洞,因此我将其重新分类。

3 个赞

你好,这个主题与我正在协助设置/管理的一个论坛遇到的问题相关。背景如下:该论坛要求用户付费注册才能发帖。同时,我们希望让达到特定信任等级的付费会员能够通过切换到匿名模式来匿名发帖。此外,我们希望所有人都能阅读内容(当然,仅限员工的内容除外)。

据我了解,匿名用户自动属于“所有人”用户组。如果我们希望全世界都能在该论坛上发帖,那么匿名用户无法发帖的问题就不存在了。但由于这是一个付费论坛,我们将“所有人”用户组设置为只读,以便任何人都可以阅读但无法发帖。

我们仍然希望具备所需信任等级的用户能够匿名发帖。原本的解决方案是创建一个具有发帖权限的“匿名用户”组,并根据我们论坛使用的匿名邮箱域名自动添加成员。然而,自动添加功能并未生效——管理员需要手动进入匿名用户组并保存更改,匿名用户才能被添加。这非常令人困扰,也破坏了我们期望的流程:即具备所需信任等级的付费会员切换到匿名模式后,即可直接匿名发帖。

我了解到,将匿名用户自动添加到某个组可能是 Discourse 正在考虑但尚未实现的功能。如果确实如此,请问是否有其他合理的方式可以配置我的 Discourse 以实现我想要的效果?还是我必须等待 Discourse 团队希望添加此功能?谢谢 :slight_smile:

我编写了一个插件,在创建用户的影子时,将用户的所有组复制到其影子中:

免责声明:我对 Ruby 完全是新手,虽然它在我的安装上可以工作,但我不知道它在其他地方是否也能工作。

2 个赞

+1 支持此功能。它实现过吗?我没看到。或者有人知道有什么插件可以做到这一点吗?

(供参考:我找到了这个,这似乎是一个不错的解决方法。)

我的一个用户为我创建了一个插件,可以自动将匿名账户添加到论坛组。这是我在 GitHub 上的 fork,我正在使用它:https://github.com/curi/cf-anon-auto-group。它一直运行良好。

我们需要这个插件来赋予他们正确的权限,以便他们可以发布任何内容。

也许其他人也可以使用这个解决方案,或者有人可以想办法制作一个更官方的插件或合并代码。

它与电子邮件自动组成员资格设置结合使用(根据我们的经验,该设置本身无效):

FWIW,我在我运行的一个论坛上“解决”了这个问题,是在数据库层面解决的。只有当无法获得其他更高级别的解决方案时才使用它(这方面有进展吗?或者应该将某个现有回复标记为“已解决”吗?)。这是 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); -- exlude admins, moderators and staff!

  return new;
end;
$$;

-- Create the trigger
CREATE TRIGGER anon_insert_trigger
AFTER INSERT ON anonymous_users
  FOR EACH ROW
    EXECUTE FUNCTION anon_insert_copy_groups_to_anon_user();