Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在Ejabberd/XMPP中,同时禁用来自多个设备的用户登录_Android_Xmpp_Chat_Ejabberd_Smack - Fatal编程技术网

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

Android 在Ejabberd/XMPP中,同时禁用来自多个设备的用户登录,android,xmpp,chat,ejabberd,smack,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, i

环境:

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)

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

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

我看到有一个选项可以限制帐户在服务器中可以活动的会话数。问题是它会启动旧的会话,但您希望不允许新的登录。看见

来自XMPP规范:

“如果已经有同名的活动资源,服务器必须(1)终止活动资源并允许新请求的会话,或(2)禁止新请求的会话并维护活动资源。服务器执行哪项操作取决于实现,尽管建议实施案例#1。”

更多信息请点击这里

因此,您当前的场景是推荐的场景

但是,我很快检查了ejabberd src代码,发现它可以以某种方式进行配置(closeold->closenew)


我不是Erlang专家,但似乎可以通过修改源代码来实现这一点,因此我使用选项资源冲突

选项resource\u conflict定义客户端尝试时的操作 使用已连接的资源登录帐户。这个 选项语法为:

资源\u冲突:setresource | closenew | closeold:可能的值 精确匹配XMPP Core:部分中描述的三种可能性 7.7.2.2. 默认值为closeold。如果客户端使用旧的Jabber非SASL身份验证(XEP-0078),则不考虑此选项, 执行的操作非常旧

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

resource_conflict: closenew 
然后重新启动ejabberd服务器

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

参考资料:

  • 阅读@rubycon对此的回答-

  • 我引用了给定的链接,并按照给定的方式对yml进行了更改。但是,它不会禁止新登录。它将启用新的登录尝试并禁用以前登录的会话。这是正确的。根据XMPP规范:如果已经存在同名的活动资源,服务器必须(1)终止活动资源并允许新请求的会话,或者(2)不允许新请求的会话并维护活动资源。服务器执行哪种操作取决于实现,尽管建议实现案例1。更多信息请点击此处,以上当前场景为推荐场景。我认为您需要检查Ejabberd是否可以切换到案例2。谢谢@Rubycon您的回答帮助我找到了解决此问题的方法。@B378很高兴听到这个消息!你可以把这个答案标记为正确的,谢谢,@Rubycon。但是,它是通过更新Ejabberd配置文档中给出的yml文件而不是源代码来解决的。由于与此不同,我添加了以下步骤作为单独的答案。