#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. Моя ошибка, я добавил утверждения, которые я использую.