我使用moquette作为我的MQTT经纪人。
我在配置中指定了一个访问控制文件:
acl_file acl.conf
然后在acl.conf文件中,我只添加了一个用户:
user gravity
topic read in
topic write out
用户 gravity 无法写入 out 主题,我收到错误消息:topic {out} doesn't have write credentials
此外,用户 gravity 可以订阅所有主题,而不仅仅是
另外,我有另一个用户, william , william 可以订阅任何主题,但不能发布任何主题。我不知道 william 可以订阅任何主题,但 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);
}
我认为这是一个有bug的函数,因为我无法看到对IAuthorizator canRead函数的任何调用
我甚至尝试构建自己的身份验证插件,我的考试也有同样的问题,即发布授权是否有效,但订阅时却不是
答案 0 :(得分:1)
可能你没有引用正确的acl文件,如果它在conf子目录中,记住路径必须是acl_file conf / acl.conf。
关于读访问权限,Moquette没有检查订阅行为的权利,只是避免发布错误,但拒绝是沉默的。
安德烈