Проверка анонимного пользователя отображаемое имя опорному пункту в режиме реального времени базы данных правил


Я устанавливаю отображаемое имя для анонимных пользователей и хочу убедиться, что новые значения соответствуют этому отображаемому имени. Следующее правило не работает:

"name": { ".validate": "newData.val() == auth.token.name" }

Почему это? Документы говорят, что отображаемое имя хранится в auth.token.name.

Ниже приведена полная копия моих правил firebase:

{
    "rules": {
    ".read": false,
    ".write": false,
    "messages": {
        ".read": true,
        "$message": {
            ".write": "auth != null",
            ".validate": "newData.hasChildren(['createdAt', 'text', 'user'])",

            "createdAt": { ".validate": "newData.val() == now" },
            "text": { ".validate": "newData.isString() && newData.val().length > 0" },
            "user": {
                ".validate": "newData.hasChildren(['_id', 'name'])",
                 "_id": { ".validate": "newData.val() == auth.uid" },
                 "name": { ".validate": "newData.val() == auth.token.name" },
            "$other": { ".validate": false }
        },
        "$other": { ".validate": false }
      }
    }
  }
}
1 7

1 ответ:

Как я уже упоминал в комментариях (взял это из документации):

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

Это означает, что вы не сможете выполнить запись в базу данных, поскольку вы объявили .write:false в корневом узле базы данных. Возможно, вы захотите удалить эту строку, чтобы иметь структура такая:

{
    "rules": {
    ".read": false,
    "messages": {
        ".read": true,
        "$message": {
            ".write": "auth != null",
            ".validate": "newData.hasChildren(['createdAt', 'text', 'user'])",

            "createdAt": { ".validate": "newData.val() == now" },
            "text": { ".validate": "newData.isString() && newData.val().length > 0" },
            "user": {
                ".validate": "newData.hasChildren(['_id', 'name'])",
                 "_id": { ".validate": "newData.val() == auth.uid" },
                 "name": { ".validate": "newData.val() == auth.token.name" },
            "$other": { ".validate": false }
        },
        "$other": { ".validate": false }
      }
    }
  }
}
Отображаемое имя действительно хранится в переменной auth.token.name. Но когда вы используете стандартную "анонимную аутентификацию" на симуляторе правил, это отправляет запрос с этой полезной нагрузкой auth по умолчанию:
{
  "provider": "anonymous",
  "uid": "N4EbtSX5HbM9JLjsW6hWT3NWzAx1"
}
Обратите внимание, что в этой полезной нагрузке нет name, поэтому переменная auth.token.name является нулевой, а правило безопасности запрещает запись.

Вы можете использовать свою пользовательскую полезную нагрузку на симуляторе, просто изменив поставщика auth с "Anonymous" в "Custom", и это позволяет редактировать полезную нагрузку, поэтому вы используете вместо этого:

{
  "provider": "anonymous",
  "uid": "N4EbtSX5HbM9JLjsW6hWT3NWzAx1",
  "token":{
    "name": "Mike"
  }
}

С этой полезной нагрузкой auth, полезная нагрузка данных, которую вы предоставили в комментариях, должна работать:

{ 
    "createdAt": { 
        ".sv": "timestamp" 
    }, 
    "text": "Test 1", 
    "user": 
    { 
        "_id": "48c83bf9-7354-4720-838f-8b68e0addd51", 
        "name": "Mike"
    }
}