Erlang 如何从ejabberd上的外部身份验证获取多用户聊天室访问控制列表

Erlang 如何从ejabberd上的外部身份验证获取多用户聊天室访问控制列表,erlang,ejabberd,Erlang,Ejabberd,我已经使用external_auth设置了ejabberd,以针对我的web应用程序的用户数据库进行身份验证。我想要的是能够为网站版主创建一个MUC(聊天室),并自动将这些用户添加到聊天中,排除所有其他用户 最终,我也希望能够将我的网站的群组功能映射到ejabberd的MUC ejabberd的外部认证API似乎没有提供细粒度的访问控制,基本上只允许您查询用户是否已注册以及用户名/密码组合是否成功认证用户 我所看到的关于acl的MUC的唯一参考是: 但这似乎需要通过webadmin界面设置权限

我已经使用external_auth设置了ejabberd,以针对我的web应用程序的用户数据库进行身份验证。我想要的是能够为网站版主创建一个MUC(聊天室),并自动将这些用户添加到聊天中,排除所有其他用户

最终,我也希望能够将我的网站的群组功能映射到ejabberd的MUC

ejabberd的外部认证API似乎没有提供细粒度的访问控制,基本上只允许您查询用户是否已注册以及用户名/密码组合是否成功认证用户

我所看到的关于acl的MUC的唯一参考是: 但这似乎需要通过webadmin界面设置权限


是否无法从外部身份验证自动执行此操作?

如果您有自己的身份验证模块,在这种情况下,您可以重定向ejabberd的身份验证过程。在ejabberd_auth.erl文件中,通过使用_authmodule/3修改check_password_和使用_authmodule/5修改check_password_两个函数重定向身份验证。从身份验证模块返回这两个函数返回的术语

如果您的身份验证模块位于不同的机器中,请建立套接字连接以与您的身份验证模块通信,并获取结果,然后将结果返回给使用身份验证模块功能检查密码


在这些更改之后,重新构建ejabberd并开始。

回答我自己的问题,似乎不可能通过使用外部身份验证来完成我需要的操作。 我最终将ejabberd命令集成到了我的web应用程序的用户/组生命周期中,这比我预期的要快,而且还有一个额外的好处,就是比使用外部身份验证快上数十万倍(我使用ejabberd的内部用户数据库,使用ejabberdctl创建用户、更新密码、从共享名册中添加和删除以及创建muc)

为了帮助完成这一过程,我为ejabberdctl创建了一个PHP包装器,可在github上免费获得:


请随意使用和滥用它。

这与简单使用外部身份验证(我已经在这么做)有什么不同?身份验证不是问题;acl是。