Firebase规则允许某些用户访问

Gaa*_*mit 5 firebase firebase-security firebase-realtime-database

在此输入图像描述 我想只有 user2,user3才能从DB而不是用户4 查看user1的信息.

我知道我需要在JSON规则中做一些事情:

当User1允许通过应用程序获得权限时,UIDUser2,UIDUser3将替换为实际ID.

 {
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止这是我的编辑:

 {
      "rules": {
    "Users":{
         "UIDHERE":{
                   ".read": auth.uid ==??
                   }
              }
      }

    }
Run Code Online (Sandbox Code Playgroud)

我该如何完成规则?我想从Allowed区域检索钥匙到这里?

Zur*_*ili 8

因此,您只希望其ID在Allowed节点中的用户读取其他用户信息.对?

如果是这样......这是规则.

"Users": {
  "$uid": {
    ".read": "root.child('Users/Allowed/'+auth.uid).exists()"
  }
}
Run Code Online (Sandbox Code Playgroud)

[更新]

$uid是一个$ variables的例子(你可以给它不同的名字但它必须以$开头),它动态获取Users位置下的key值.

例如:我给你的规则只允许Allowed节点下的用户读取其他用户信息,但如果该用户不在Allowed节点中,它将阻止用户读取自己的信息.如果你想添加它,你需要改变这样的规则.

"Users": {
  "$uid": {
    ".read": "$uid == auth.id || root.child('Users/Allowed/'+auth.uid).exists()"
  }
}
Run Code Online (Sandbox Code Playgroud)

================================================== =======================

在火力规则有预定义变量,例如,now,root,auth,data,newData$变量.

如果规则结构中有$ location,则可以在规则表达式中使用匹配的$变量来获取正在读取或写入的实际子项的名称.因此,假设我们希望为每个用户提供对其自己/用户/位置的读写访问权限.我们可以使用:

从firebase文档https://firebase.google.com/docs/reference/security/database/#location复制

如果您想了解有关firebase安全规则的更多信息,请阅读以下部分.

https://firebase.google.com/docs/database/security/

PS

你的结构不太好.Users节点下的数据是混乱的.您不应该将Allowed节点与userIds放在同一级别上.相反,如果您allowedUsersUsers节点级别创建新的node()并在Allowed那里移动数据会更好.

AllowedUsers
  - userid2
  - userid3
Users
  - userid1
  - userid2
  - userid3
  - userid4
Run Code Online (Sandbox Code Playgroud)