在Ejabberd / XMPP中同时禁用来自多个设备的用户登录

时间:2018-08-15 09:05:04

标签: android xmpp chat ejabberd smack

  

环境:

     

Ejabberd版本:16.04

     

Smack-android-4.1.0

我正在开发一个Android聊天应用程序。当前,可以从多个设备登录使用相同的用户凭据。

当前情况如下:

1. User logs in into the app in device A
2. Using the same username and password, the user logs successfully into the app in device B
3. Now device A says, it is disconnected, but continue the chat in device B

但是,根据给定的要求,它的行为应如下所示:

1. User logs in into the app in device A
2. Using the same username and password, when the user tries to log in from device B, it should not allow it. 
(Since he is already logged in from device A)

很高兴听到您对此的解决方案/想法。预先感谢。

3 个答案:

答案 0 :(得分:1)

根据XMPP规范:

“如果已经存在同名的活动资源,则服务器必须(1)终止活动资源并允许新请求的会话,或者(2)禁止新请求的会话并维护活动资源。尽管建议执行案例1,服务器还是要根据具体情况来执行。”

更多信息,请点击https://xmpp.org/rfcs/rfc3921.html#session

因此,建议您使用当前方案。

但是,我迅速检查了ejabberd src代码,发现可以通过某种方式对其进行配置(closeold-> closenew)

https://github.com/processone/ejabberd/blob/master/src/ejabberd_c2s.erl#L964

https://github.com/processone/ejabberd/blob/master/src/ejabberd_c2s.erl#L873

我不是Erlang专家,但看起来可以通过修改源代码来实现

答案 1 :(得分:1)

因此,我设法使用选项 resource_conflict

解决了该问题

根据Ejabberd Configuring Docs

  

选项 resource_conflict 定义了客户端尝试时的操作   登录到具有已连接资源的帐户。的   选项语法为:

     

resource_conflict:setresource | closenew | closeold:可能的值   与XMPP Core中描述的三种可能性完全匹配:   7.7.2.2。默认值为closeold。如果客户端使用旧的Jabber Non-SASL身份验证(XEP-0078),则不考虑该选项,   并且执行的动作是closeold。

因此打开ejabberd.yml并将以下行添加到该文件。

resource_conflict: closenew 

然后重新启动ejabberd服务器。

现在,它将禁止新连接的客户端进行资源绑定尝试,并维持当前连接的客户端的会话。

参考文献:

  1. https://tools.ietf.org/html/rfc6120#section-7.7.2.2
  2. 阅读@rubycon对此的答案-https://stackoverflow.com/a/51860779/5361779

答案 2 :(得分:0)

如果设备B设置的资源不同于设备A,则两者都可以正确连接到同一帐户。在您的测试中,设备B设置了与设备A完全相同的资源,然后ejabberd启动了较旧的会话。

我看到有一个选项可以限制帐户可以在服务器中处于活动状态的会话数。问题在于它启动了较早的会话,但是您想禁止新的登录。看到 https://docs.ejabberd.im/admin/configuration/#limiting-opened-sessions-with-acl