Firebase разрешает запись только для зарегистрированного пользователя


Firebase разрешает запись только для зарегистрированного пользователя

19.10.2019 06:25:23 Просмотров 127 Источник

Я создаю новый проект в Vue JS. Я создаю блог с интеграцией военнослужащих. Идея заключается в том, что любой зарегистрированный пользователь может создавать сообщения в блоге, которые сохраняются в базе данных Firebase в режиме реального времени в разделе: https://xxx.firebaseio.com/blogs.json, каждый блог имеет уникальный идентификатор firebase.

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

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

Ниже приведены мои текущие правила:

{
  "rules": {
    "blogs": {
      ".read": true,
      ".write": false,
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Я хотел бы иметь возможность создавать все сообщения в блоге для зарегистрированного пользователя и создавать сообщения в blogs, а не в идентификаторе пользователя: $uid, как я могу этого добиться?

В настоящее время это выход, который я получаю с моими текущими правилами, перечисленными около:

{
    "PvWsi3t9mFZza5gXP8qNQaCktDN2": {
      "-LrZ87XS02DanBTybhij": {
        "body": "<p><strong>test</strong></p>",
        "creation": "",
        "slug": "test",
        "title": "My very first blog post"
      },
      "-LrZ8KjsJyGT1YFsIJ3G": {
        "body": "<p><strong>jjj</strong></p>",
        "creation": "2019-10-19",
        "slug": "test-2",
        "title": "Second post"
      }
    },
    "yLLOq9jC5odefHBENkO3r2ztNzZ2": {
      "-LrZ8ZRhLVEylBFaGcnq": {
        "body": "<p>content here</p>",
        "creation": "2019-10-04",
        "slug": "test-two",
        "title": "My very first blog post - ryan"
      }
    }
  }

ОБНОВЛЕНИЕ

Вот мой Firebase ref, который добавляет сообщение в блоге:

firebase.database().ref('blogs/' + this.$store.state.user.uid).push(this.post).then(() => {
         console.log('success')
      }).catch((err) => {
         console.log('error', err)
      })
У вопроса есть решение - Посмотреть?

Ответы - Firebase разрешает запись только для зарегистрированного пользователя / Firebase only allow write for logged in user

Является ответом!
Stratubas

19.10.2019 07:04:59

С такими правилами, как (непроверенные)

"rules": {
    "blogs": {
        ".read": true,
        "$blogId": {
            ".write": "(!data.exists() || data.child('author').val() == auth.uid)
                    && (newData.child('author').val() == auth.uid || !newData.exists())"
        }
    }
}

вы можете использовать плоскую структуру для своих блогов, добавив author

Вы обеспокоены тем, что, сделав UIDs публично известными, любой может использовать поддельный UID и писать в вашу базу данных. Это все равно, что сказать, что люди не должны знать, что вы "RyanHolton", потому что они могут делать сообщения и помечать их как ваши.

В ваших правилах, const postWithAuthor = this.post; postWithAuthor.author = this.$store.state.user.uid; firebase.database().ref('blogs').push(postWithAuthor).then(() => { console.log('success'); }).catch((err) => { console.log('error', err); }); гарантирует, что если кто-то говорит, что они X, они также аутентифицируются как X. Люди действительно смогут писать в вашу базу данных, но им придется поместить свой реальный UID для "автора".

Если вы хотите разрешить только некоторым людям писать, вы должны добавить их uid в свою базу данных, возможно, в путь "администраторы", и добавить

newData.child('author').val() == auth.uid

к вашим ".письменные правила.

https://stackoverflow.com/questions/58465148/firebase-only-allow-write-for-logged-in-user/58465502#comment103266346_58465502
Это, кажется, не работает: Error saving rules - Line 6: Invalid == expression: left operand is not a number, boolean, string, null. это ошибка, которую я получаю при попытке опубликовать новые правила, также я обновил ('author), поскольку здесь есть синтаксическая ошибка.
https://stackoverflow.com/questions/58465148/firebase-only-allow-write-for-logged-in-user/58465502#comment103266358_58465502
Вошедший пользователь на панели мониторинга будет иметь $uid
https://stackoverflow.com/questions/58465148/firebase-only-allow-write-for-logged-in-user/58465502#comment103266430_58465502
Обновлено до:"`".напишите":" (!данные.существует() || данные.ребенок ("автор").функция val() == авт.жидкости) && (newData.ребенок ("автор").функция val() == авт.ЮИД || !новые данные.существует ()) "" однако, я получаю отказ в разрешении, обновил свой исходный вопрос о том, как я создаю сообщение
https://stackoverflow.com/questions/58465148/firebase-only-allow-write-for-logged-in-user/58465502#comment103266804_58465502
@RyanHolton Ой:) я исправил пример правил. Я вижу, вы добавляете this.$store.state.user.uid в путь. По моим правилам, ты не должен.
https://stackoverflow.com/questions/58465148/firebase-only-allow-write-for-logged-in-user/58465502#comment103266910_58465502
@RyanHolton Смотрите пример кода, который я добавил
https://stackoverflow.com/questions/58465148/firebase-only-allow-write-for-logged-in-user/58465502#comment103278466_58465502
это работает сейчас! Спасибо! Единственная проблема, которую я бы сейчас имел, - это postWithAuthor.author сохраняются в Firebase в реальном времени базу данных, в идеале я бы не хотел, чтобы хранить пользователя uid в базу данных, я бы хотел заменить его чем-то другим, прежде чем он будет сохранен, потому что если кто-то знал, что uid пользователя, они были бы в состоянии писать в базу?
https://stackoverflow.com/questions/58465148/firebase-only-allow-write-for-logged-in-user/58465502#comment103280513_58465502
@RyanHolton Проверьте мое обновление на ответ. Это было бы слишком долго для комментария.
https://stackoverflow.com/questions/58465148/firebase-only-allow-write-for-logged-in-user/58465502#comment103280725_58465502
Можно создать структуру базы данных, которая будет проверять uid, не делая их общедоступными. Если у вас есть 2 автора и добавить публичную игру "Угадай, кто написал этот блог", Люди могут использовать UIDs, чтобы обмануть. Но вы же не создаете эту игру, не так ли? :Д
Помочь в развитии проекта:
Закрыть X