Firebase规则通配符密钥

时间:2020-10-09 17:47:04

标签: java android firebase firebase-realtime-database firebase-security

我已经在论坛上搜索了有关此问题的答案,但找不到答案。 我正在将一个“键:值”对写入Firebase数据库,并希望设置规则。

这是一个聊天应用程序,我为用户所属的每次聊天添加一个字段,例如user / $ uid / chat / $ chat_id

我正在使用创建的chatId

FirebaseDatabase.getInstance().getReference().child("chat").push().getKey();

我正在尝试添加某种验证,以便数据必须包含$ chat_id:true。 但是我正在努力使通配符起作用。

我正在编写的测试数据- “ -M5STgMVWyafV-LhPIT2”:“ true”,但是我需要将Key用作通配符,因为它每次都是随机的。

数据结构如下。

chat
    -M5STgMVWyafV-LhPIT2   // <<< $chat_id
        info
            admin: "zQvmGG2vPfTrdjZBfWP2ZotajYE2"
            groupName: "Some Group"
            id: "-MJD6cAtpxY_jmFyk-sb"
            no_of_users: 2
            timer: 60000
            users
                y1EKihfmIJTDCD9OJt0N89WDC642: true
                zQvmGG2vPfTrdjZBfWP2ZotajYE2: true
        messages
            -MJ0G0gdecak8ACR7fb2
                creator: "wjl8VNmcaPNHJAUQnCDRHWkJ33p2"
                date: "Oct 06, 2020"
                text: "Some Text"
                time: "23:13"
                userName: "Bob"

user
    zQvmGG2vPfTrdjZBfWP2ZotajYE2
        chat
            -M5STgMVWyafV-LhPIT2: true  // <<< $chat_id
            -MGNk6fl8jneDhw7Jv02: true
            -MGNkFGD4OYb7ZSzX8P2: true
            -MGNl47kbPuNZFc3RLD2: true
            -MGNyFIuhjrwyQT4VME2: true
            -MGNydtnFHW60i5TbzW2: true
            -MJ-ETJ-LcOxvYkZ8b72: true

        info
            email: "someemailaddress@me.com"
            name: "Bob"
            notificationKey: "be5df5fa-3a20-4704-986f-8a35d"
            profilePic: "https://"
            status: "Some status"
    zQvmGG2vPfTrdjZBfWP2ZotajYE3
    zQvmGG2vPfTrdjZBfWP2ZotajYE4

还有我尝试过的规则,如果我将$ chat_id指定为字符串,这些规则将起作用。

{
  "rules": {
    "user": { 
      ".read": "auth != null",
        ".indexOn": "info/email",
      "$user_id": {
          
                "chat": {                           
                ".write": "auth != null",
                ".validate": "newData.child($chat_id).val() == 'true'", // <<< this doesn't work Unknown variable '$chat_id'.
                //".validate": "newData.child("-M5STgMVWyafV-LhPIT2").val() == 'true'",  <<< this works, but not $chat_id, I need this Child to be a wildcard

              },
               "info": { 
                //".indexOn": "email", 
                ".write": "auth != null && $user_id === auth.uid",
              },
            }
        },
    "chat": {
     //".write": "auth != null && !data.child('chat').child('$chat_id').exists()",
    "$chat_id": {
          "info": {
            ".read": "data.child('users').child(auth.uid).exists()",
            ".write": "auth != null && !data.exists()&&newData.child('admin').val()==auth.uid || data.child('users').child(auth.uid).exists()",
          },
          "messages": {
              "$message_id": {
                ".write": "root.child('chat').child($chat_id).child('info').child('users').child(auth.uid).exists()",
                ".read": "root.child('chat').child($chat_id).child('info').child('users').child(auth.uid).exists()",    
             }
        }
      }
    },
  }
}

任何帮助将不胜感激。 谢谢

2 个答案:

答案 0 :(得分:0)

此:

$chat_id

表示您正在检查新数据是否有一个子节点,其字面称为$。除了不正确的事实(因为密钥中不允许使用$chat_id)之外,它也可能不是您想要的。

如果您想检查新数据中的子数据是否与数据库中的$chat_id相同,请使用不带引号的newData.hasChild($chat_id) 。所以:

tsc -h

答案 1 :(得分:0)

我找到了正确的语法。我需要在write函数之后添加变量,然后将validate放在变量之后。

以防万一以后帮助任何人。

      "$user_id": {
            "chat": {                           
                  ".write": "auth != null",
                "$chat_id":    {
                  ".validate": "$chat_id.length === 20 && newData.val() === 'member'",
                },
                  },