如何在 Ejabberd 或 MongooseIM 中对其他用户隐藏一组用户?

How to hide a group of users from others in Ejabberd or MongooseIM?

假设我在 RDBMS 数据库中有 10,000 个用户名,这些用户名将使用我将手动放入数据库中的 XMPP 聊天服务,如 Ejabberd 或 MongooseIM。现在这 10,000 个用户名中的每 1000 个用户名的 JID 用户名中都有固定的前缀,例如:

1-1000 个用户名以 aa__ 开头(示例 - aa10001、aa10002、...)

1001-2000 用户名以 bb__ 开头(示例 - bb10001、bb10002、...)

2000-3000 个用户名以 cc__ 开头(示例 - cc10001、cc10002、...)

等等...总共10个不同的前缀用户名

现在我只希望这 10 个不同的对不能知道其他前缀用户名对,并且不能向其他对(具有不同的前缀)发送任何类型的节(如消息、存在、IQ)

可能性:

  1. 如果我可以在阻止策略中使用一些正则表达式,那会很棒而不是阻止个人。

  2. 我知道您可能会建议为每一对使用不同的虚拟主机。但是管理如此多的虚拟主机可能很困难,因为在上面的示例中,10K 只是大局中的一个小例子。

如果您不清楚问题,请告诉我?

I just want that these 10 different pairs must not know others prefix usernames pairs and must not be able to send any type of stanza (like message, presence, IQ) to other pair (having a different prefix)

首先,玩mod_filter。查看其示例配置,您可能可以使用它完成您想要的: https://github.com/processone/ejabberd-contrib/tree/master/mod_filter

也许您可以根据用户名模式("aa*" 或类似的东西)定义 ACL,这样您就可以将所有用户都放在一个虚拟主机中。

如果唯一的解决方案需要为每个用户组配备一个虚拟主机,一些想法:

Now every 1000 usernames in the above 10,000 have fixed prefix in their JID usernames like:

如您所述,您可以在 ejabberd 中为每个用户组定义一个 vhost:10001@aa.example.com... 或者为了不更改现有用户名:aa10001@aa.example.com...

Maybe if I can use Virtual host in some way that it is easy to manage (adding new pairs frequently) without adding a new database for each then that will be a best-ever solution

是的,如果您像这样配置 ejabberd 并在创建数据库时使用适当的 *.sql 文件,您可以将所有虚拟主机放在一个数据库中:

new_sql_schema: true

Can I add a virtual host dynamically in the config without stopping the server?

是的,它应该可以工作(这是最近的一项功能)。根据需要编辑 ejabberd.yml,然后重新加载:

$ ejabberdctl reload_config