两个端口上都有连接...在 5288 上,用户通过浏览器的 Web 套接字进行连接,在 5222 上通过常规客户端进行连接...当没有访问限制时,一切都会连接,一切正常...如果我在客户端端口 5222 上仅向管理员添加访问权限,则 5288 上的 Web 套接字开始流动“服务服务拒绝访问。 SASL 绑定失败。” ...问题是,是否可以通过端口划分访问权限?我在哪里可以扭转它?
listen:
-
port: 5288
module: ejabberd_http
request_handlers:
"/ ws": ejabberd_http_ws
web_admin: true
-
port: 5222
module: ejabberd_c2s
# access:
# - allow: admin
答案1
过了一段时间...在服务器故障星系中...
我将使用 ejabberd,因此...我花了一些时间学习 Erlang。如果我理解正确的话,那么可能有人认为“http”和“c2s”模块的“access”属性是通用的。此外,“ejabberd_http”模块根本没有此属性。读取配置时,始终只采用第一次读取“ejabberd_c2s”的第一个“access”。但是,正如我在问题中所写,这不是我的情况。我需要为“http”和“c2s”设置单独的访问权限。要解决问题:
- 仅出于顺序考虑,我创建了一个单独的文件“ejabberd_http_config.erl”(“ejabberd_c2s_config.erl”的副本),并更改了函数“get_c2s_limits/0”:
...
get_http_limits() ->
HttpListen = ejabberd_config:get_option(listen, []),
case lists:keysearch(ejabberd_http, 2, HttpListen) of
false -> [];
{value, {_Port, ejabberd_http, Opts}} ->
select_opts_values(Opts)
end.
...
- 在“ejabberd_http.erl”函数中的“listen_options/0”函数中添加了元组“{access, all}”。
- 在“ejabberd_http_ws.erl”中的函数“init/1”中将行“Opts = ejabberd_c2s_config:get_c2s_limits()++SOpts, ”更正为“Opts = ejabberd_http_config:get_http_limits()++SOpts, ”。
然后我简单地编译了这 3 个文件,并将替换后的模块上传到服务器。重新启动服务器,然后就好了。现在您可以分别为“http”和“c2s”设置访问权限。现在 Gajim(端口 5222)仅在管理员登录下连接,同时 websocket(端口 5288)可用于所有连接(默认为“access: all”,除非明确指定)。