Как использовать Redis в качестве серверной части для mosquitto ACL (используется плагин JPmens)?

Я работаю над Mosquitto и планирую использовать Redis в качестве серверной части для обработки аутентификации пары имя пользователя/пароль и ACL. Для этого я использую плагин аутентификации JPmens. Аутентификация работает хорошо, но я не могу заставить работать ACL. Redis использует уникальные ключи, а имена пользователей (ключи в моем случае) используются в парах имя пользователя/пароль для целей аутентификации. Я пытался смешать имя пользователя, пароль и темы вместе в наборах/списках, но ни один из них не работает.

комар конф:

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

Как правильно это сделать? В API Redis 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 ожидается строковый тип. Может ли кто-нибудь дать мне пример того, как заставить это работать?

Спасибо


person xxc6    schedule 06.04.2015    source источник


Ответы (2)


Я понял, как это работает. Если брокер MQTT разрешает клиенту user1 публиковать и подписывать темы «a/b» и «c/d», правильные данные ACL в Redis для плагина JPmens будут такими:

пользователь1-а/б 2

user1-c/d 2

«user1-a/c» — это ключ, а 2 — это значение.

person xxc6    schedule 11.04.2015

Нежелательно, если Redis по какой-либо причине выйдет из строя, вся ваша система также выйдет из строя.

Это будет SPF (единая точка отказа) в вашей архитектуре.

person Eric Hal    schedule 07.05.2015