moquette 用户的权限与访问控制列表中的权限不同
moquette users have privilege different than what is written in the access control list
我正在使用 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 可以订阅所有主题,而不仅仅是 in
另外,我还有一个用户,是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);
}
而且我认为这是有错误的函数,因为我看不到任何对 IAuthorizator canRead 函数的调用
我什至尝试构建自己的身份验证插件,我在考试中遇到了同样的问题,发布授权有效,但订阅无效
可能您没有引用正确的 acl 文件,如果它位于 conf 子目录中,请记住路径必须是 acl_file conf/acl.conf.
关于读取权限,Moquette在订阅行为上不检查权限,只是避免发布消息,拒绝是无声的。
安德里亚
我正在使用 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 可以订阅所有主题,而不仅仅是 in
另外,我还有一个用户,是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);
}
而且我认为这是有错误的函数,因为我看不到任何对 IAuthorizator canRead 函数的调用
我什至尝试构建自己的身份验证插件,我在考试中遇到了同样的问题,发布授权有效,但订阅无效
可能您没有引用正确的 acl 文件,如果它位于 conf 子目录中,请记住路径必须是 acl_file conf/acl.conf.
关于读取权限,Moquette在订阅行为上不检查权限,只是避免发布消息,拒绝是无声的。
安德里亚