允许列出具有读取权限的子项的数据库规则
Database rule allowing to list children with read access
我的应用程序中有一个消息列表,我希望我的用户检索他们自己的消息列表。
如果我以 "user1" 身份登录,我可以毫无问题地获取 /messages/message1,但是如果我想检索所有消息(没有能够使用 /messages/ 访问其他用户的消息)即使我可以访问某些子元素
,我的权限也被拒绝
如何在不知道消息 ID 的情况下向我的用户提供所有具有读取权限的子元素的列表?
提前致谢。
下面是我的数据库:
{
"messages" : {
"message1" : {
"sender" : "user1_uid"
},
"message2" : {
"sender" : "user1_uid"
}
}
这是我的规则:
{
"messages": {
"$weddingId": {
".read": "data.child('sender').val() == auth.uid"
}
}
}
我建议进行重构以实现您的期望,因为您将无法使用 .orderByChild('sender').equalTo(user_uid)
,因为您没有授予对 /messages
分支的读取权限(仅针对它的子分支)。
您可以将 userId
作为 /messages
中的一个分支,并在其中包含所有玩家消息 ID。您需要像下面这样保存消息数据:
{
"messages" : {
"userId" : {
"message1" : {
"text": "tetet"
},
"message2" : {
"text" : "tetet2"
}
},
"userId2": {...}
}
那么您的规则将如下所示:
{
"messages": {
"$userId":{
".read": "$userId == auth.uid",
"$weddingId": {
//...
}
}
}
最后,您将能够获得所有用户消息:
firebaseRef.child('messages').child(user_uid).once('value', function(snapshot) {
if (snapshot.val()){
console.log(snapshot.val());
}
})
Adolfo 有一种有效的方法。他将消息数据散布在用户特定的节点下。这在 NoSQL 数据库中很常见,本质上是构建许多 "mini-tables of messages" 而不是一个大数据库。
或者,您可以保留消息的主列表,但为每个用户创建一个所谓的消息索引:
{
"messages" : {
"message1" : {
"sender" : "user1_uid"
},
"message2" : {
"sender" : "user1_uid"
}
},
"user_messages": {
"user1_uid": {
"message1": true,
"message2": true
}
}
您会像现在一样保留 messages
的安全规则,但为新的 user_messages
索引添加这些规则:
"user_messages": {
"$userId":{
".read": "$userId == auth.uid"
}
}
有了这些,您可以通过首先从 /user_messages/<authData.uid>
加载消息 ID,然后从 /messages/<messageId>
.
加载每条消息来为用户加载消息
另请参阅我们的 guide on creating data that scales 以了解有关此技术(称为扇出)的更多信息。
我的应用程序中有一个消息列表,我希望我的用户检索他们自己的消息列表。
如果我以 "user1" 身份登录,我可以毫无问题地获取 /messages/message1,但是如果我想检索所有消息(没有能够使用 /messages/ 访问其他用户的消息)即使我可以访问某些子元素
,我的权限也被拒绝如何在不知道消息 ID 的情况下向我的用户提供所有具有读取权限的子元素的列表?
提前致谢。
下面是我的数据库:
{
"messages" : {
"message1" : {
"sender" : "user1_uid"
},
"message2" : {
"sender" : "user1_uid"
}
}
这是我的规则:
{
"messages": {
"$weddingId": {
".read": "data.child('sender').val() == auth.uid"
}
}
}
我建议进行重构以实现您的期望,因为您将无法使用 .orderByChild('sender').equalTo(user_uid)
,因为您没有授予对 /messages
分支的读取权限(仅针对它的子分支)。
您可以将 userId
作为 /messages
中的一个分支,并在其中包含所有玩家消息 ID。您需要像下面这样保存消息数据:
{
"messages" : {
"userId" : {
"message1" : {
"text": "tetet"
},
"message2" : {
"text" : "tetet2"
}
},
"userId2": {...}
}
那么您的规则将如下所示:
{
"messages": {
"$userId":{
".read": "$userId == auth.uid",
"$weddingId": {
//...
}
}
}
最后,您将能够获得所有用户消息:
firebaseRef.child('messages').child(user_uid).once('value', function(snapshot) {
if (snapshot.val()){
console.log(snapshot.val());
}
})
Adolfo 有一种有效的方法。他将消息数据散布在用户特定的节点下。这在 NoSQL 数据库中很常见,本质上是构建许多 "mini-tables of messages" 而不是一个大数据库。
或者,您可以保留消息的主列表,但为每个用户创建一个所谓的消息索引:
{
"messages" : {
"message1" : {
"sender" : "user1_uid"
},
"message2" : {
"sender" : "user1_uid"
}
},
"user_messages": {
"user1_uid": {
"message1": true,
"message2": true
}
}
您会像现在一样保留 messages
的安全规则,但为新的 user_messages
索引添加这些规则:
"user_messages": {
"$userId":{
".read": "$userId == auth.uid"
}
}
有了这些,您可以通过首先从 /user_messages/<authData.uid>
加载消息 ID,然后从 /messages/<messageId>
.
另请参阅我们的 guide on creating data that scales 以了解有关此技术(称为扇出)的更多信息。