Пользователи moquette имеют привилегии, отличные от того, что написано в списке контроля доступа

Я использую moquette в качестве моего брокера MQTT.

Я указываю файл контроля доступа в моей конфигурации, как это:

acl_file acl.conf

и затем в файле acl.conf я добавил только одного пользователя, как это:

user gravity
topic read in
topic write out

Моя проблема

Пользователь Gravity не может написать в тему, я получаю сообщение об ошибке: topic {out} doesn't have write credentials

Кроме того, пользователь гравитации может подписаться на все темы, а не только в

Плюс, у меня есть другой пользователь, который является Уильямом, и Уильям может подписаться на любую тему, но не может публиковать на любую тему. Я не знаю, как это возможно, что Уильям может подписаться на любую тему, хотя ACL- файл утверждает, что у меня есть только один пользователь, который имеет привилегию в списке

Заметка

Я добавляю тег для mosquitto, хотя я работаю над moquette, и это потому, что они используют один и тот же формат acl

Обновить

После прочтения кода брокера,

Я обнаружил, что эта функция вызывается при поступлении нового запроса на подписку:

@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);
        }

И я думаю, что эта функция имеет ошибку, потому что я не вижу вызова функции canRead IAuthorizator

Я даже пытался создать свой собственный плагин для аутентификации, и у меня есть экзамен та же проблема, что авторизация при публикации работает, но при подписке это не так

1 ответ

Решение

Вероятно, вы не ссылаетесь на правильный файл acl, если он находится в подкаталоге conf, помните, что путь должен быть acl_file conf/acl.conf.

Что касается доступа для чтения, Moquette не проверяет права на акт подписки, просто избегает публиковать сообщения, но отрицающий молчит.

Andrea

Другие вопросы по тегам