我们如何让 ejabberd 服务器使用现有用户数据,而不是为名册创建新数据库?
Posted
技术标签:
【中文标题】我们如何让 ejabberd 服务器使用现有用户数据,而不是为名册创建新数据库?【英文标题】:How can we make ejabberd server use existing users data, instead of creating a new database for roster? 【发布时间】:2013-06-04 06:47:22 【问题描述】:假设一个网站已经注册了用户,并且有一个方法可以让他们通过网站在自己的好友列表中添加和删除好友。
现在,我想使用 ejabberd xmpp 服务器实时获取存在信息,但我不想让 xmpp 服务器为名册创建新数据库。 有什么方法可以配置 ejabberd 以避免 ejabberd 服务器和网站服务器上的数据重复?
【问题讨论】:
【参考方案1】:如果您不想编写自定义 ejabberd 模块,可以将 ejabberd 配置为从 SQL 数据库加载名册。如果您的所有花名册修改都是由您的 webapp 完成的,那么从 ejabberd 的角度来看,数据库是“只读的”,您可以编写一个 SQL 视图,该视图具有 ejabberd 预期的模式,但使用您已经拥有的数据表。 请参阅表定义https://github.com/processone/ejabberd/blob/master/src/odbc/mysql.sql,您需要“rosterusers”和“rostergroups”表。请注意,这种方法有一些限制。除非您的应用程序通知 ejabberd,否则连接的用户不会立即看到名册的更改,因此 ejabberd 可以通知客户端。为此,您可能无论如何都需要编写自定义代码,并了解 roster push http://xmpp.org/rfcs/rfc3921.html#roster
或者您可以编写自己的自定义模块来访问您的花名册数据。
【讨论】:
【参考方案2】:默认情况下,Ejabberd 使用 Mnesia 数据库来存储用户和名册等。 您可以使用 SQL SERVER、MySQL、Postgress 等外部数据库配置 Ejabberd。
您必须将 ejabberd 配置为使用外部数据库(例如:odbc)而不是内部数据库。
请参阅下文以使用 MySQL 配置 Ejabberd:http://iohq.net/index.php?title=Building_an_Ejabberd_Server_with_MySql
之后,一个 sql 脚本以适当的订阅值传输“users”和“rosteruser”表中的现有用户。直接在“rosteruser”中完成的名册更改不会立即被连接的用户看到。要解决此问题,您可以从应用程序逻辑 (php/asp.net/java) 获取好友请求确认事件,然后通过 XMPP 客户端添加名册。使用此过程,所有名册更新事件都将反映在所有连接上。
【讨论】:
如果 MySQL 架构不同怎么办?以上是关于我们如何让 ejabberd 服务器使用现有用户数据,而不是为名册创建新数据库?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 smack 库从客户端搜索 ejabberd 服务器上的注册用户?