Firebase разрешает запись только для зарегистрированного пользователя
Я создаю новый проект в 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

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
к вашим ".письменные правила.

Error saving rules - Line 6: Invalid == expression: left operand is not a number, boolean, string, null.
это ошибка, которую я получаю при попытке опубликовать новые правила, также я обновил ('author)
, поскольку здесь есть синтаксическая ошибка.

$uid


this.$store.state.user.uid
в путь. По моим правилам, ты не должен.


postWithAuthor.author
сохраняются в Firebase в реальном времени базу данных, в идеале я бы не хотел, чтобы хранить пользователя uid
в базу данных, я бы хотел заменить его чем-то другим, прежде чем он будет сохранен, потому что если кто-то знал, что uid
пользователя, они были бы в состоянии писать в базу?

