Обновление: ошибки - ошибка в симуляторе правил, см. Комментарий Дуга ниже.
Я опробовал ваши правила, и они работали, как и ожидалось, в симуляторе.
Правила:
match /UserProfile {
function isUserLoggedIn(){
return request.auth != null;
}
function isUserBlocked(uId){
return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
}
match /{uId}{
allow get: if isUserLoggedIn() && !isUserBlocked(uId);
}
}
Тестовый запрос в симуляторе:
get /UserProfile/foo
Authenticated: Yes
Firebase UID: bar
Запрос выполняется или не выполняется на основании документа UserSettings/foo
в базе данных:
Запретитьrequest:
/UserSettings/foo
{
content: "my content"
blocked: { bar: true }
}
Разрешает запрос:
/UserSettings/foo
{
content: "my content"
blocked: { otheruser: true }
}
Я думаю, что ошибки могут появляться, когда данные не существуют или не находятся в ожидаемом формате.
Например, если я удаляю документ /UserSettings/foo
, я также получаю:
Error: simulator.rules line [58], column [28]. Function not found error: Name: [get].
Я также получаю эту ошибку, если поле blocked
отличается от карты (поскольку in
являетсяфункция для карт):
Error: simulator.rules line [58], column [95]. Function not found error: Name: [in].
Вероятно, вы можете устранить эти ошибки, используя exists
и проверив тип blocked
, но в любом случае ваши правила все равно должны отклонять запрос, как и ожидалось.