Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 具有自定义键/值比较的Firebase读/写规则_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 具有自定义键/值比较的Firebase读/写规则

Android 具有自定义键/值比较的Firebase读/写规则,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我正在尝试制作一个简单的位置跟踪应用程序。在设备上,我安装了我的位置广播服务,并更新Firebase实时数据库上的位置数据。在我的第二台设备上,我用谷歌地图监控活动。到目前为止,其工作正常,数据库更新,位置反映在监测设备地图上 但我想设置某些规则,因为只有具有特定令牌/ID的用户/设备才能访问设备的位置数据,该令牌/ID将在广播设备上的每个位置广播开始时生成,并存储在Firebase RDB上。令牌/ID将通过我的服务器与监控设备共享 现在,我尝试在这里编写一些规则,以检查监控设备提供的令牌/I

我正在尝试制作一个简单的位置跟踪应用程序。在设备上,我安装了我的位置广播服务,并更新Firebase实时数据库上的位置数据。在我的第二台设备上,我用谷歌地图监控活动。到目前为止,其工作正常,数据库更新,位置反映在监测设备地图上

但我想设置某些规则,因为只有具有特定令牌/ID的用户/设备才能访问设备的位置数据,该令牌/ID将在广播设备上的每个位置广播开始时生成,并存储在Firebase RDB上。令牌/ID将通过我的服务器与监控设备共享

现在,我尝试在这里编写一些规则,以检查监控设备提供的令牌/ID是否可用,是否允许进行监控

{
  "rules": {
    "$userID":{
      ".read" : "data.child('boadCastingID').val() === 'ASy34345-5KJHSDF3-34k3-334nH'"
    }
  }
}

有可能吗?我还发现了一些其他方法,其中提取datasnapshot,然后比较不同的值,我发现这些值有点不安全,因为数据已经在监控设备上可用,但无论访问如何都不可见。

如果我理解正确,从数据库读取数据时,您正试图将自定义值传递到安全规则中

只有两种方法可以将数据传递给安全规则:

  • 作为你正在阅读的路径的一部分
  • 作为查询的参数
  • 作为随每个请求一起发送的用户身份验证令牌的一部分
  • 因此,如果希望基于广播ID保护数据访问,则必须将其作为路径、查询的一部分,或者将其作为自定义声明添加到用户的身份验证令牌中

    将广播ID添加到路径 要基于广播ID保护对数据的访问,可以将给定广播ID下的所有数据存储在数据库中:

    broadcastIds: {
      "broadcastID-1234-ddolhqsdakp": { ... },
      "broadcastID-woepaacaiuq-3456": { ... }
    }
    
    现在我们不允许访问
    广播ID
    ,但将允许访问每个子节点:

    {
      "rules": {
        "broadcastIds": {
          ".read": true
      }
    }
    
    使用此设置,如果用户已经知道某个广播ID,则只能读取该广播ID的数据。如果您的广播ID足够不可用,则这是确保访问该数据安全的合理方法


    安全地查询数据 或者,您可以将广播ID存储在每个用户节点中,在查询中将其传递给数据库,然后保护该查询。在此场景中,JSON可能如下所示:

    users: {
      "user1uid": {
        broadcastId: "abc",
        ...
      },
      "user2uid": {
        broadcastId: "xyz",
        ...
      }
    }
    
    该查询类似于:

    DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("users");
    usersRef.orderByChid("broadcastId").equalTo("abc")...
    
    然后,允许该查询(并拒绝其他读取)的安全规则是:

    {
      "rules": {
        "broadcastIds": {
          ".read": "query.orderByChild == 'broadcastId' && query.equalTo == data.child('boadCastingID').val()"
      }
    }
    
    有关这方面的更多信息,请参阅上的Firebase文档


    将广播ID放入用户的ID令牌中 最后的办法将是。您可以通过在受信任的环境中调用Firebase Admin SDK来实现这一点,例如在Node.js服务器上,该服务器具有:

    admin.auth().setCustomUserClaims(uid, {broadcastID: "abc"})
    
    然后,您可以通过以下方式检查安全规则中是否存在自定义声明:

    ".read": "auth.token.broadcastID == 'abc'"
    

    如果看不到执行安全规则的代码,安全规则本身就毫无意义。请编辑您的问题以显示:1)此处正在读取和保护的JSON数据,2)读取此数据的代码,3)您遇到的问题/错误。非常感谢@Frank。你的第二个解决方案就是我一直在寻找的。我知道逻辑和一切,但不知道我可以通过查询请求进行验证。对于其他两个选项,第一个也是一个很好的解决方案,因为BroadcastID是主节点,如果请求设备没有BroadcastID,那么不管规则如何,它都不会找到任何内容。关于这里的最后一个选项,我使用匿名登录,所以我不知道它是否适合所有用户,因为匿名登录是匿名的,带有auth令牌和所有东西。但就目前而言,第二名才是前进的方向。谢谢。谢谢你澄清乔。我认为自定义声明应该与匿名auth一起使用,但我同意其他to选项可能更适合您的用例。