禁止某个用户订阅含有通配符的topic吗?

描述你需要的功能

能通过acl配置文件实现 禁止某个用户订阅含有通配符的topic吗?

为什么你需要这个功能

防止某些用户一次性订阅太多的topic

是可以的,你看一下 etc/acl.conf 文件。

就是默认的配置文件,没有改动过。emqx 5.0.21

{allow, {username, "^dashboard?"}, subscribe, ["$SYS/#"]}.

{allow, {ipaddr, "127.0.0.1"}, all, ["$SYS/#", "#"]}.

{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.

{allow, all}.

{deny, {username,"test01"},subscribe,["\+\#\*"]}.

我回复的最后一行 是我自己加的,没有生效的。其他就是配置文件自带的

{deny, {username,"test01"},subscribe,["\+\#\*"]}.

{deny, {username,“test01”},subscribe,[“/+/#”]}.

没有成功,仍然能够订阅成功。

解决了吗,我也遇到同样的问题。

{Deny, {username,“test01”},subscribe,[{re, “^[+#]$”}“]}.这是我想要的结果,但是目前第四个元素不支持正则

如果不行,那就是不支持了, 你可以尝试多个人用同一个账户,那样就可以直接禁用一个账户,就做到类似的效果了.

topic 不支持正则。
你是想禁止客户端订阅 +# 对么
可以这样写:

{deny, {username, "test01"}, subscribe, [{eq, "+"}, {eq, "#"}]}.

我记得我最后放弃了,好像是不支持通配符的写法的. 你可以试试,我忘了

testtopic/test0123 和 authz 规则中的 “/+/#” 不匹配
不应该带最前面的 “/”
应该这样写

{deny, {username, "test01"}, subscribe, ["+/#"]}.

不过实际上这样会拒绝 test01 这个客户端订阅单层或多层的任意主题,换言之它无法订阅任何主题

不是 禁止客户端订阅 +# ,而是想禁止客户端 订阅中包涵+ 和# 例如:禁用 link/+/+/data ,但是客户端能订阅 link/aa/bb/data 这个,就是检测 topic 中是否包含+或#,而不知只有 +或者#,感谢您的回复,非常感谢。

如果是想要对于所有客户端都不允许使用通配符订阅,可以直接关闭该配置
但目前还不支持在 authz 规则中使用正则对订阅的主题进行检测,只能使用主题匹配的方式。
我会向产品反馈下这个需求。

好的我明白了,再次感谢您的支持。

1 个赞

原来还有这个配置,学到了