我正在研究Mosquitto并计划使用Redis作为后端来处理用户名/密码对身份验证和ACL。我正在使用JPmens' authentication plugin来执行此操作。身份验证效果很好,但我无法使ACL工作。 Redis使用唯一密钥,用户名/密码对中使用用户名(我的情况下的密钥)进行身份验证。我试图在集/列表中混合用户名,密码和主题,但它们都不起作用。
mosquitto conf:
auth_plugin /etc/mosquitto/auth-plug.so
auth_opt_backends redis
auth_opt_redis_host 127.0.0.1
auth_opt_redis_port 6379
auth_opt_redis_userquery GET %s
auth_opt_redis_aclquery GET %s-%s
以下名称/密码对正常运行身份验证
SET user1 PBKDF2 $ sha256 $ 901 $ Qh18ysY4wstXoHhk $ g8d2aDzbz3rYztvJiO3dsV698jzECxSg
SET user2 PBKDF2 $ sha256 $ 901 $ R74X2ae3MufMS20M $ CAbXZFDmXJN7Cc28Dm / Z97OfM8Tz1JHn ...
以下设置不适用于ACL :( a / b ...作为主题)
sadd user22 PBKDF2 $ sha256 $ 901 $ Qh18ysY4wstXoHhk $ g8d2aDzbz3rYztvJiO3dsV698jzECxSg a / b c / d
rpush user33 PBKDF2 $ sha256 $ 901 $ q5 / N74O6Iaf / e8Cg $ dEA3tZSi / sJeXKAkX39Gd3agy2WY96gE e / f
这样做的正确方法是什么?
在Redis API中,aclrequery
显示:
Single stepping until exit from function be_redis_aclcheck, which has no line number information.
redisCommand (c=0x6537d0, format=0x6561c0 "GET user1-t/c") at hiredis.c:1345
1345 void *redisCommand(redisContext *c, const char *format, ...) {
(gdb) bt
0 redisCommand (c=0x6537d0, format=0x6561c0 "GET my-t/c") at hiredis.c:1345
1 0x00007ffff5e61376 in be_redis_aclcheck () from /etc/mosquitto/auth-plug.so
2 0x00007ffff5e5c351 in mosquitto_auth_acl_check ()
来自/etc/mosquitto/auth-plug.so
此处,user1
是用户名,t/c
是主题。 GET user1-t/c
似乎告诉我Redis数据库中应该有一个字符串类型。谁能给我一个如何让它工作的例子?
由于
答案 0 :(得分:1)
我已经弄明白它是如何运作的。如果MQTT代理仅允许客户端user1发布和子“a / b”和“c / d”主题,则Redmens中JPmens插件的正确ACL数据将为:
user1-a / b 2
user1-c / d 2
“user1-a / c”是键,2是值。
答案 1 :(得分:1)
如果Redis出于任何原因导致整个系统也崩溃,那么这不是首选。
这将是您架构中的SPF(单点故障)。