Правила безопасности группы коллекций Firestore: массив содержит любые

#firebase #google-cloud-firestore #firebase-security

#firebase #google-cloud-firestore #firebase-безопасность

Вопрос:

У меня есть коллекции записей с объектами, которые содержат массив имен groupIds, который содержит все идентификаторы, с которыми связана публикация.

Я выполняю этот запрос, где ids — это массив всех идентификаторов групп, частью которых является пользователь.

 firebase
    .collectionGroup('posts')
    .where('groupIds', arrayContainsAny: [CS5GQ487VRChV9Z0N50P, 3wsvOvGZ6UOA7r5N5qjj, 3ZdEykm19nd2yMYe1FFB, pleFNwQ98ggdfyqWmAXn, 97PiIGlvoDMecJzxC38b, MaY7oJGHz2zIZ7PSLEfc])
    .orderBy('created', descending: true)
    .limit(20);
  

Я использую эти правила. (Ни один пост не содержит более 10 идентификаторов группы)

 function hasGroupReadPermissionsMultiple(groupIds){
    return (groupIds[0] != null amp;amp; groupIds[0] in request.auth.token) ||
      (groupIds[1] != null amp;amp; groupIds[1] in request.auth.token) ||
      (groupIds[2] != null amp;amp; groupIds[2] in request.auth.token) ||
      (groupIds[3] != null amp;amp; groupIds[3] in request.auth.token) ||
      (groupIds[4] != null amp;amp; groupIds[4] in request.auth.token) ||
      (groupIds[5] != null amp;amp; groupIds[5] in request.auth.token) ||
      (groupIds[6] != null amp;amp; groupIds[6] in request.auth.token) ||
      (groupIds[7] != null amp;amp; groupIds[7] in request.auth.token) ||
      (groupIds[8] != null amp;amp; groupIds[8] in request.auth.token) ||
      (groupIds[9] != null amp;amp; groupIds[9] in request.auth.token);
}

match /{somePath=**}/posts/{postId}{
  allow read: if hasGroupReadPermissionsMultiple(resource.data.groupIds);
}
  

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

 {CS5GQ487VRChV9Z0N50P: a, MaY7oJGHz2zIZ7PSLEfc: a, auth_time: 1599646120, 3wsvOvGZ6UOA7r5N5qjj: a, cR2j2ed4LbsCZYMib7yt: a, sub: hfn2VSqEJUMVBQLmyPa2jFhNA1Q2, user_id: hfn2VSqEJUMVBQLmyPa2jFhNA1Q2, iat: 1599719905, iss: https://securetoken.google.com/XXX, aud: XXX, het-persijntje: a, name: Jan Jansen, pleFNwQ98ggdfyqWmAXn: a, exp: 1599723505, 3ZdEykm19nd2yMYe1FFB: a, JLTmBMxPerm8BY75KEBX: a, 97PiIGlvoDMecJzxC38b: a, email_verified: true, email: XXX@XXX.XX, firebase: {identities: {email: [XXX@XXX.XX]}, sign_in_provider: password}, het-persijntje-test-excel: a}
  

Я хочу, чтобы пользователи получали доступ к сообщениям только в том случае, если какая-либо из групп, частью которых они являются, связана с сообщением. Кто-нибудь видит мою ошибку? Из есть ли более эффективный способ достичь этого?

Ответ №1:

request.auth.token относится ко всей полезной нагрузке JSON пользовательских утверждений. Это будет объект карты с полями для каждого утверждения, а не массив, как вы используете его сейчас. Вам нужно будет вызвать конкретное свойство, содержащее массив, для повторной проверки, например request.auth.token.nameOfTheListField .

Кроме того, вы можете проверить, содержит ли массив элементы из другого массива с помощью hasAny, вместо того, чтобы повторно индексировать исходный массив.

 request.auth.token.nameOfTheListField.hasAny(groupIds)
  

Комментарии:

1. Моя структура утверждений немного отличается. Я использую groupId в качестве ключа с ролью пользователя в этой группе в качестве значения. Итак, основываясь на вашем ответе, я попробовал оба request.auth.token.keys.hasAny (groupIds) и groupIds.hasAny (request.auth.token.keys), но безуспешно.

2. Если у вас есть определенный формат для утверждений, то ваш вопрос должен точно объяснить, что это такое. Пользовательские утверждения — это просто JSON, поэтому покажите JSON, который вы добавляете к учетной записи.

3. Моя ошибка, я добавил утверждения, которые я использую.