Добавьте команды модуля RedisJSON в ACL

Я использую RedisStack 6.2.6-v6.

У меня есть следующий пользователь в моем списке acl:

user username on -@all +@read +@write +@connection ~prefix:* > somepassword

При попытке выполнить команды из модуля JSON я получаю следующую ошибку:

NOPERM this user has no permissions to run the 'json.set' command or its subcommand

как я могу решить это, не делая +@all?

Создание Twitter-подобного приложения Trending Topics App с Redis (на примере PHP)
Создание Twitter-подобного приложения Trending Topics App с Redis (на примере PHP)
Redis - это популярная база данных типа "ключ-значение" в памяти с поддержкой различных типов и структур данных, которая в основном используется для...
1
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В документации ACL указано, что команды модулей не входят в группы команд, и приведены некоторые доводы:

«Обратите внимание, что категории команд никогда не включают команды модулей, за исключением +@all. Если вы говорите +@all, все команды могут быть выполнены пользователем, даже будущие команды, загружаемые через систему модулей. Однако, если вы используете правило ACL +@read или любой другой, команды модулей всегда исключаются. Это очень важно, потому что вы должны просто доверять внутренней таблице команд Redis. Модули могут выставлять опасные вещи и в случае просто аддитивного ACL, форма +@all -... Вы должны быть абсолютно уверены, что никогда не включите то, чего не хотели."

Итак, что вам нужно сделать, это явно перечислить команды JSON.<whatever>, которые вы хотите, чтобы пользователь выполнял. Вот пример:

Создайте пользователя, который может запускать json.set, json.get и json.arrpop только на ключах, начинающихся jsondocs::

127.0.0.1:6379> acl setuser justjson on >mypassword ~jsondocs:* -@all +json.set +json.get +json.arrpop
OK

Войдите как этот пользователь:

127.0.0.1:6379> auth justjson mypassword
OK

Попробуйте команду, которую нам не разрешено использовать:

127.0.0.1:6379> sadd someset hello
(error) NOPERM this user has no permissions to run the 'sadd' command or its subcommand

Попробуйте команду, которую нам разрешено использовать, но не на клавиши, с которыми нам разрешено работать:

127.0.0.1:6379> json.set nothere $ '{"hello": "world"}'
(error) NOPERM this user has no permissions to access one of the keys used as arguments

Попробуйте команду, которую мы можем использовать для той части пространства ключей, с которой мы можем работать:

127.0.0.1:6379> json.set jsondocs:shouldbeok $ '{"hello": [ "world", "welt", "monde"]}'
OK
127.0.0.1:6379> json.get jsondocs:shouldbeok $
"[{\"hello\":[\"world\",\"welt\",\"monde\"]}]"
127.0.0.1:6379> json.arrpop jsondocs:shouldbeok $.hello
1) "\"monde\""

Попробуйте команду JSON, которую нам не разрешено использовать в части пространства ключей, с которой нам разрешено работать — ожидайте неудачи:

127.0.0.1:6379> json.numincrby jsondocs:shouldbeok $.counter 2
(error) NOPERM this user has no permissions to run the 'json.numincrby' command or its subcommand

Документы Redis ACL: https://redis.io/docs/management/security/acl/

Другие вопросы по теме