request.resource.data.hasAll(['uid', 'email', 'role'])
не работает, поскольку request.resource.data
представляет собой Map
, а не List
. Вы должны использовать keys()
, чтобы создать List
из Map
и убедиться, что определенные ключи существуют.
Что касается вашей второй проблемы, вам следует просто проверить, есть ли запись в roles
: allow update: if !('roles' in request.writeFields) || isAdmin();
. Это обеспечит сбой любых обновлений roles
, если пользователь не является администратором.
о вашем секретном вопросе; Я вижу пару вопросов. Во-первых, любой может создавать неограниченное количество пользователей, что также означает, что любой администратор может создавать неограниченное количество других учетных записей администратора. Чтобы этого не случилось, я бы добавил в allow create
еще один раздел, ограничивающий создание пользователя:
allow create: if userId == request.resource.data.uid
&& request.auth.uid == request.resource.data.uid
&& request.resource.data.hasAll(['uid', 'email', 'role'])
&& request.resource.data.role.isAdmin == false
&& request.resource.data.role.isReader == false;`
Во-вторых, любой может изменить их uid
и попытаться выдать себя за кого-то другого. Очевидно, это не меняет uid
, связанный с их токеном аутентификации, но в зависимости от того, как вы пишете остальные свои правила, бэкэнд-безопасность или даже отображение внешнего интерфейса, кто-то может использовать этот недостаток для использования вашего кода или другого пользователя. (потенциально админ). Вы можете убедиться, что никто не изменит свои uid
, проверив, находится ли он в writeFields
(, вам также понадобится предыдущее решение для обеспечения безопасности, чтобы они также не выдавали себя за себя при создании ).
allow update: if !('uid' in request.writeFields)
&& (!('roles' in request.writeFields) || isAdmin());
Надеюсь, это поможет.