我正在尝试实现一个带有两个侦听器的 mosquitto 代理。一个不安全,一个 TLS 安全。基本上,对于订阅(阅读)主题,您不必提供任何凭据和其他信息。但它不起作用。匿名用户仍然可以发布到主题。
我咨询了手册页在我看来一切都做对了,但只要我有这行,allow_anonymous true
即使是 acl 中的第一行,topic read #
它也可以允许匿名写入。我allow_anonymous false
使用未包含在 ACL 中的用户进行了双重检查。在这种情况下,我仍然能够发布到主题,foo/generic/something
唯一的变化是需要有效用户,但 ACL 仍然无法按我预期的方式工作。
因此,基本上连手册页上都写着
第一组主题适用于匿名客户端,假设allow_anonymous为真。
它不起作用。我做错了什么?我使用的是 mosquitto 1.4.7。我在下面附加了我的配置(路径有点疯狂,因为我在一台共享机器上)
mosquitto配置文件
retry_interval 30
sys_interval 15
store_clean_interval 15
pid_file /home/johndoe/mosquitto/pidfile.pid
port 61883
# tls listener
listener 61884
cafile /home/johndoe/mosquitto/tls/ca.crt
certfile /home/johndoe/mosquitto/tls/server.crt
keyfile /home/johndoe/mosquitto/tls/server.key
require_certificate false
tls_version tlsv1.2
# acls
acl_file /home/johndoe/etc/mosquitto/mosquitto.acl
password_file /home/johndoe/etc/mosquitto/mosquitto.passwd
allow_anonymous true
mosquitto.acl
topic read #
user john
topic readwrite foo/
答案1
您使用制表符分隔 ACL 文件中的字段。ACL 文件要求使用(任意数量的)空格。
虽然手册页没有明确说明这一点,但 strtok_r 使用分隔符“ ”来解析文件。这意味着只有空格才是可接受的分隔符。
因此,要使您的访问控制正常工作,只需用空格替换制表符即可。