开启exhook后ACL不生效

版本:开源4.4.19
开启exhook之前,不存在的ACL帐号以及匿名用户是不可以连接服务的
但开启exhook插件之后,不存在的ACL帐号以及匿名用户可以连接服务,只是无法订阅发布,仿佛允许匿名设置为false不生效一样

看看这个命令的返回值里面的:request_failed_action 的值是什么

emqx eval " application:get_all_env(emqx_exhook)."

再看看都开了什么插件:有没有开多个 acl

emqx ctl plugins list

https://github.com/emqx/emqx/blob/v4.4.19/apps/emqx_exhook/src/emqx_exhook_handler.erl#L137
看实现是你只要返回ignore,他就是变成通过,如果想拒绝没有的账号,在 exhook server 上没查到对应的账号,返回 deny 就行。不要返回 ignore

ignore 在存在多个 acl 授权链的时候才显得有用。比如同时开启了 exhook 和HTTP ACL 检查。
1.在exhook 中没有找到这个账户,返回 ignore,他就会继续到下一个检查器 http 里面再找。
2. 如果在exhook 中没有找到这个账户,返回的是 deny,他就会直接拒绝。这时第二个 http检查器就没有作用了。

[{request_failed_action,deny},
{hook_priority,0},
{request_timeout,5000},
{servers,[{default,[{scheme,http},
{host,“127.0.0.1”},
{port,9000},
{socket_options,[{keepalive,true},{nodelay,true}]}]}]},
{auto_reconnect,60000}]

看输出是返回deny的,但是为什么就算空的用户名跟帐号密码还是可以连接

除了我这个命令的输出,还要确认一下 exhook server 是不是没找到返回的是deny(不是ignore)

这个如何确认,但是校验是否允许匿名用户登录不是在hook逻辑执行之前吗,为什么开启了hook这个逻辑没执行

这个emqx_exhook_server:call实现看找不到就是返回ignore?
call(Hookpoint, Req, #server{name = ChannName, options = ReqOpts,
hookspec = Hooks, prefix = Prefix}) →
case need_call(Hookpoint, Req, Hooks) of
true →
inc_metrics(Prefix, Hookpoint),
do_call(ChannName, hk2func(Hookpoint), Req, ReqOpts);
false →
ignore
end.

什么意思:thinking:

我是看的源码,不确定是否理解正确。
其实我的疑问还是为什么开启了hook检查是否匿名用户的逻辑就不执行了一样

麻烦开个 debug 日志,把日志上传一下。
我看代码没什么问题,需要日志分析一下。