Каков правильный синтаксис регулярных выражений в правилах безопасности Google Cloud Firestore? - PullRequest
0 голосов
/ 26 апреля 2018

РЕДАКТИРОВАТЬ: После просмотра ответа в 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
    )
}

Похоже, что либо документация неверна, программа проверки синтаксиса редактора не работает должным образом, либо я по какой-то причине неправильно понимаю, как работают правила безопасности.

Вот снимок экрана с синтаксической ошибкой:

Here is a screenshot of the syntax error occurring

...