РЕДАКТИРОВАТЬ: после просмотра ответа на https://stackoverflow.com/a/44876864/6792075 я до сих пор не знаете, почему необходимо дважды экранировать точку с '\\.'
, особенно потому, что документация ясно показывает, что '\.'
является ожидаемым синтаксисом (см. мой второй пример ниже). Ответ также ссылается на первый пример ('.*\..*'
), но измененный с помощью двойного экранирования ('.*\\..*'
), но я считаю, что это все равно не удастся по причинам, которые я описываю ниже.
Я пытаюсь разделить строку memberUIDs.some_ID_here
на символ точки, но есть некоторые расхождения между документами по правилам безопасности Firestore и синтаксисом, разрешенным в редакторе правил.
Правила безопасности предоставляют метод .split()
для строк: https://firebase.google.com/docs/firestore/reference/security/#split:
// Allow documents named "user.*" to be uploaded
match /{document} {
allow write: if user.split('.*\..*')[0] == 'user'
}
В документах также есть пример, показывающий разделение символа точки с другим регулярным выражением:
// Allow read if a document has the string 'user' in it
match /{document} {
allow read: if 'user' in document.split('\.');
}
Первая проблема связана с первым примером. Если вы на самом деле используете это регулярное выражение, оно соответствует всей строке, что не позволит вам разделить символ точки; он принимает всю строку в качестве разделителя, в результате чего получается массив из двух пустых строк.
Вторая проблема связана со вторым примером. Это регулярное выражение должно работать правильно, и оно работает в тестах с онлайн-редакторами регулярных выражений; однако редактор правил выдает синтаксическую ошибку в этом регулярном выражении при использовании в функции split()
. Фактически, если вы попытаетесь использовать строку '\.'
в любом месте, редактор выдаст синтаксическую ошибку.
Прямо сейчас я использую '\\.'
в качестве своего регулярного выражения, которое не вызывает синтаксическую ошибку в редакторе, но я не думаю, что это работает правильно:
match /groups/{groupID} {
allow write: if (
request.writeFields[0].split('\\.')[0] == 'memberUIDs' &&
request.writeFields[0].split('\\.')[1] == request.auth.uid
)
}
Похоже, либо документация неверна, либо проверка синтаксиса редактора работает неправильно, либо я что-то в корне не понимаю в том, как работают правила безопасности.
Вот скриншот синтаксической ошибки:
'\.'
и'\\.'
преобразуются в одно и то же\.
в любом редакторе. Однако некоторые редакторы делают глупости и требуют, чтобы экранированный символ был чем-то, что они узнают. Там, где \ вынужден экранироваться, если это литерал (как одинарные, так и двойные кавычки),.
может не иметь такой роскоши. Fopa может быть в сообщении об ошибке, что оно говорит? - person   schedule 27.04.2018