EMQ 问答社区

钩子程序校验发布和订阅权限校验不起作用问题

环境信息

  • EMQ X 版本:4.3.1
  • 操作系统及版本:centos7
  • 其他

问题描述

钩子代码:直接将返回值设置成 STOP_AND_RETURN ,但还是可以发布和订阅 topic
代码如下:

 @Override
    public void onClientCheckAcl(ClientCheckAclRequest request, StreamObserver<ValuedResponse> responseObserver) {
        log.info("onClientCheckAcl:{}", gson.toJson(request));
        ValuedResponse reply ;
        log.info("没有权限onClientCheckAcl");
        reply = ValuedResponse.newBuilder().setBoolResult(false).setType(ValuedResponse.ResponsedType.STOP_AND_RETURN).build();
        responseObserver.onNext(reply);
        responseObserver.onCompleted();
    }

谢谢!

你先调试一下,看看这个回调有没有被调用到。


./bin/emqx_ctl exhook server list

还有这个

./bin/emqx eval "ets:lookup(emqx_hooks, 'client.check_acl')"

执行下这个看看输出是?


https://askemq.com/uploads/default/original/1X/6434c2a9f0649a5116a7f1aefa3b4b32d9095991.png

看这个图里面的打印

Cannot publish messages to AAAAA due to …

这里确实是已经 发布失败了呢。这应该是符合你的期望的?

我看客户端显示已经发版成功了,没有发版失败的反馈;
还有要是发版校验失败,我希望直接将终端踢下线要在哪里处理?

MQTT 的协议 对于 Qos0 的 PUBLISH 失败 客户端是没法知道的(因为 QoS0没有应答的)

仅在 MQTT v5.0 版本的协议;QoS1 和 QoS2 的 PUBLISH消息有失败的应答报文,客户端才能知道。

目前要达到这个效果,可以直接配置 emqx.conf 下的

## The action when acl check reject current operation
##
## Value: ignore | disconnect
## Default: ignore
acl_deny_action = disconnect

配置这个,只要认证失败就踢下线了?发布认证和订阅认证?
谢谢!