0

我使用 moquette 作为我的 MQTT 代理。

我在我的配置中指定了一个访问控制文件,如下所示:

acl_file acl.conf

然后在 acl.conf 文件中,我只添加了一个用户,如下所示:

user gravity
topic read in
topic write out

我的问题

用户重力无法写入输出主题,我收到错误消息:topic {out} doesn't have write credentials

此外,用户重力可以订阅所有主题,而不仅仅是

另外,我还有另一个用户,即william,并且william可以订阅任何主题,但不能发布任何主题。我不知道威廉怎么可能订阅任何主题,尽管acl文件指出我只有一个具有列出权限的用户

笔记

尽管我正在研究 moquette,但我正在为 mosquitto 添加一个标签,那是因为它们共享相同的 acl 格式

更新

准备好broker的代码后,

我发现这是新订阅请求到来时调用的函数:

@MQTTMessage(message = SubscribeMessage.class)
    void processSubscribe(ServerChannel session, SubscribeMessage msg) {
        String clientID = (String) session
                .getAttribute(NettyChannel.ATTR_KEY_CLIENTID);
        boolean cleanSession = (Boolean) session
                .getAttribute(NettyChannel.ATTR_KEY_CLEANSESSION);
        LOG.debug("SUBSCRIBE client <{}> packetID {}", clientID,
                msg.getMessageID());

        // ack the client
        SubAckMessage ackMessage = new SubAckMessage();
        ackMessage.setMessageID(msg.getMessageID());

        for (SubscribeMessage.Couple req : msg.subscriptions()) {
            AbstractMessage.QOSType qos = AbstractMessage.QOSType.values()[req
                    .getQos()];
            Subscription newSubscription = new Subscription(clientID,
                    req.getTopicFilter(), qos, cleanSession);
            boolean valid = subscribeSingleTopic(newSubscription,
                    req.getTopicFilter());
            ackMessage.addType(valid ? qos : AbstractMessage.QOSType.FAILURE);
        }

我认为这是有错误的函数,因为我看不到任何对 IAuthorizator canRead 函数的调用

我什至尝试构建自己的身份验证插件,并且我遇到了同样的问题,即发布授权有效,但订阅授权无效

4

1 回答 1

1

可能您没有引用正确的 acl 文件,如果它位于 conf 子目录中,请记住路径必须是 acl_file conf/acl.conf。

关于读取权限,Moquette 没有检查订阅行为的权限,只是避免发布消息,但拒绝是沉默的。

安德烈亚

于 2015-07-23T16:57:42.887 回答