РЕДАКТИРОВАТЬ: После просмотра ответа в 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
)
}
Похоже, что либо документация неверна, программа проверки синтаксиса редактора не работает должным образом, либо я по какой-то причине неправильно понимаю, как работают правила безопасности.
Вот снимок экрана с синтаксической ошибкой: