firebase实时数据库分片规则

2024-01-10

2019-11-03 更新:添加了错误的实时最小再现 https://shardautherror.firebaseapp.com。在 Chrome 中加载链接后,按 ctrl+shift+i 并选择控制台以查看输出。我已尽力确保这完全符合我原始项目代码的功能;我们会看看情况是否如此,是吗?分片的规则文件与下面的原始帖子相同。这源代码可以在 GitHub 上找到 https://github.com/ChrisChiasson/shardAuthError.

<!DOCTYPE html>
<html>
<body>
 <script src="https://www.gstatic.com/firebasejs/7.2.3/firebase-app.js"></script>
 <script src="https://www.gstatic.com/firebasejs/7.2.3/firebase-auth.js"></script>
 <script src="https://www.gstatic.com/firebasejs/7.2.3/firebase-database.js"></script>
 <script>
  const config={
   apiKey: "AIzaSyDLMc0GUf5n2nQa3aqpELQu7lziprQOGs8",
   authDomain: "shardautherror.firebaseapp.com",
   databaseURL: "https://shardautherror.firebaseio.com",
   projectId: "shardautherror",
   storageBucket: "shardautherror.appspot.com",
   messagingSenderId: "841096336504",
   appId: "1:841096336504:web:9899961c8250caa552498d"
  };

  const shard="https://shardautherror-1e9ed.firebaseio.com/";

  async function init(){
   try{
    firebase.database.enableLogging(true);
    const defaultApp=firebase.initializeApp(config);
    const auth=defaultApp.auth();
    const s="[email protected] /cdn-cgi/l/email-protection";
    await auth.signInWithEmailAndPassword(s,s);
    const uid= auth.currentUser.uid;
    const shardApp=firebase.initializeApp({databaseURL:shard},'dbAppShard');
    const db=firebase.database(shardApp);
    const ref= db.ref("/chat/"+uid+"/fail/"+uid);
    const time= firebase.database.ServerValue.TIMESTAMP;
    ref.set({time});
   } catch(e) {
    console.error("init failed",e);
   }
  }

  init();
 </script>
</body>
</html>

原帖:

这些规则在模拟器中有效,但在我真正的网络应用程序中无效。模拟器路径和负载与下面的数据库日志输出中所示的相同。

database.rules.json (main目标两个分片都使用此规则文件;我在部署时验证)

{
 "rules":{
  "chat":{
   "$ownerId":{
    "fail":{
     "$pId":{
      ".write": "$pId== auth.uid&& $ownerId== auth.uid",
      "time":{".validate": "newData.val()== now"},
      "$other":{".validate": "newData.isString()&& newData.val().length>= 28"}
     }
    }
   }
  }
 }
}

Firebase 记录失败的 set 命令的输出。它只写入一个称为时间的值。这是我第一次尝试使用rtdb。我已经将其设置为分片。它在尝试访问实时数据库之前从 firestore 获取分片名称,但它看起来不像竞争条件(尽管有日志输出),原因我将在下面概述。

index.esm.js:81 [2019-10-19T03:02:53.281Z]  @firebase/database: 0: set 
 {"path":"/chat/rpNIK41hNpWkYY2KqndkwCzPJuF3/fail/rpNIK41hNpWkYY2KqndkwCzPJuF3",
  "value":{"time":{".sv":"timestamp"}},"priority":null} 
22:02:53.285 index.esm.js:81 [2019-10-19T03:02:53.285Z]  @firebase/database:
 p:0: Buffering put: /chat/rpNIK41hNpWkYY2KqndkwCzPJuF3/fail/rpNIK41hNpWkYY2KqndkwCzPJuF3 
22:02:53.293 index.esm.js:81 [2019-10-19T03:02:53.293Z]  @firebase/database:
 p:0: Making a connection attempt 
22:02:53.294 index.esm.js:81 [2019-10-19T03:02:53.294Z]  @firebase/database:
 getToken() completed. Creating connection. 
22:02:53.295 index.esm.js:81 [2019-10-19T03:02:53.295Z]  @firebase/database:
 c:0:0: Connection created 
22:02:53.296 index.esm.js:81 [2019-10-19T03:02:53.296Z]  @firebase/database:
 p:0: Auth token refreshed 
22:02:53.298 index.esm.js:81 [2019-10-19T03:02:53.298Z]  @firebase/database:
 c:0:0:0 Websocket connecting to wss://quickstart-1551998385825-7f7a6.firebaseio.com/.ws?v=5 
22:02:53.534 index.esm.js:81 [2019-10-19T03:02:53.534Z]  @firebase/database:
 c:0:0:0 Websocket connected. 
22:02:53.539 index.esm.js:81 [2019-10-19T03:02:53.539Z]  @firebase/database:
 c:0:0: Realtime connection established. 
22:02:53.539 index.esm.js:81 [2019-10-19T03:02:53.539Z]  @firebase/database:
 p:0: connection ready 
22:02:53.542 index.esm.js:81 [2019-10-19T03:02:53.541Z]  @firebase/database:
 p:0: reportStats {"c":{"sdk.js.7-0-0":1}} 
22:02:53.542 index.esm.js:81 [2019-10-19T03:02:53.542Z]  @firebase/database:
 p:0: {"r":1,"a":"s","b":{"c":{"sdk.js.7-0-0":1}}} 
22:02:53.546 index.esm.js:81 [2019-10-19T03:02:53.546Z]  @firebase/database:
 p:0: {"r":2,"a":"p","b":{"p":"/chat/rpNIK41hNpWkYY2KqndkwCzPJuF3/fail/rpNIK41hNpWkYY2KqndkwCzPJuF3",
  "d":{"time":{".sv":"timestamp"}}}} 
22:02:53.591 index.esm.js:81 [2019-10-19T03:02:53.591Z]  @firebase/database:
 p:0: from server: {"r":1,"b":{"s":"ok","d":""}} 
22:02:53.595 index.esm.js:81 [2019-10-19T03:02:53.595Z]  @firebase/database:
 c:0:0: Primary connection is healthy. 
22:02:53.596 index.esm.js:81 [2019-10-19T03:02:53.596Z]  @firebase/database:
 p:0: from server: {"r":2,"b":{"s":"permission_denied","d":"Permission denied"}} 
22:02:53.597 index.esm.js:81 [2019-10-19T03:02:53.597Z]  @firebase/database:
 p:0: p response {"s":"permission_denied","d":"Permission denied"} 

所以,在此之后,如果我将规则更新为".write": true,时间戳写入成功。在日志中它显示"r":3 ...,所以我知道它没有丢弃连接并重新启动。如果我然后将其更改为".write": "auth.uid != null", or ".write": "auth != null",(因此,不检查所有权,只检查客户端是否登录,与上面不同)它再次拒绝权限"r":4 ..."表示第四个请求。所以,看来我的客户端完全无法对分片进行身份验证。

Simulator output: simulator shows success with the same rules

建议?我确信我做错了什么。

顺便说一句,用户文档到处都是......所有这些实际上都有效吗?

"baskets": {
  ".read": "auth.uid != null &&// auth.uid!= null from https://firebase.google.com/docs/database/security/securing-data
".read": "auth != null && auth.uid == $uid" // auth != null from https://firebase.google.com/docs/database/security/user-security
".write": "$user_id === auth.uid" // triple equal from https://firebase.google.com/docs/database/security/user-security
 ".write": "request.auth.uid == uid" // request.auth from realtime database tab of content owner access from https://firebase.google.com/docs/rules/basics

这里有两个问题,问题的第一部分需要更多信息。

问题的第二部分

顺便说一句,用户文档到处都是...都是 这些实际上有效吗?

文档并不是真的到处都是。您包含的每个规则示例都来自不同的用例。

例如,“篮子”中的 .read 规则适用于该特定节点“篮子”,确保只有经过身份验证的用户才能读取篮子节点。它将允许任何经过身份验证的用户读取该节点。该行中有一个额外的 &&,因此不确定规则的其余部分是什么。

第二条读取规则将应用于它所在的任何节点,并确保用户经过身份验证,并且只有经过身份验证的用户才能读取该节点(即,这是他们的节点,其他人都无法访问它)

对于写入,===(三等号)包含在文档 https://firebase.google.com/docs/reference/security/database#_equals并说

注意:: == 被视为 ===。如果您在安全规则中使用 ==,那么 当规则运行时将被转换为===。

最后一次写入只是检查请求的 uid 是否是当前经过身份验证的用户。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

firebase实时数据库分片规则 的相关文章

随机推荐

  • 有没有办法在 Flask WTForms 中创建数据列表字段?

    有谁知道一种方法来创建datalist在 Flask 中使用 WTForms 字段 我知道如何创建一个SelectField但如果列表中没有 我需要允许用户输入自己的值 这就是我想做的http www w3schools com tags
  • 引用Java属性文件中的其他变量[重复]

    这个问题在这里已经有答案了 可能的重复 如何引用java util Properties中的另一个属性 https stackoverflow com questions 872272 how to reference another pr
  • 无法禁用日志消息

    我在摆脱 Spring 生成的调试消息时遇到了一些麻烦 类似于以下消息 有数千个这样的条目 19 58 08 380 main DEBUG o s b f s DefaultListableBeanFactory Creating shar
  • “为什么运行时异常是不可恢复的?”

    在Java文档中 我看到了定义 如果可以合理地预期客户端会从异常中恢复 则将其设为受检查的异常 如果客户端无法执行任何操作来从异常中恢复 请将其设为未经检查的异常 未经检查的异常 争议 https docs oracle com javas
  • 如何使用 ProcessBuilder 与 CLI 程序持续交互

    我经常使用通过 docker 容器访问的 CLI 程序 进入容器后 我就可以开始使用相关的 CLI 程序 我遇到的问题是我想继续与同一个命令行实例交互 基本上我正在尝试创建一个将在 CLI 程序 之上 运行的 GUI 程序 我只是不知道如何
  • 为 AWS 设置“Stackdriver Kubernetes 监控”

    Google Cloud Platform 在 Kubecon 2018 上宣布了 Stackdriver Kubernetes Monitoring 看起来棒极了 我是一名运行着几个 Kubernetes 集群的 AWS 用户 我立即羡慕
  • 使用HMS Toolkit添加HMS和GMS时找不到com.huawei.hms:hwid:5.3.0.301 &推送套件

    我正在尝试将 HMS 添加到我们的 GMS 第一个应用程序中 这是一个庞大的应用程序 因此我们决定尝试 HMS Toolkit 转换软件 该工具包添加了必要的依赖项和模块 并在需要时进行了适当的替换 但是当我尝试构建我们的应用程序时 我收到
  • 异常:类型错误:无法设置未定义的属性“消息”

    在升级旧的 Angular 2 项目的许多依赖项后 我在运行时收到以下错误 EXCEPTION TypeError Cannot set property message of undefined ErrorHandler handleEr
  • gSoap EWS“错误 500:内部服务器错误”

    我在使用 ews gSoap 时遇到一些问题 我有下一个代码 ExchangeServiceBindingProxy proxy new ExchangeServiceBindingProxy endpoint c str soap pSo
  • 如何使用 Spark 数据框评估 Spark Dstream 对象

    我正在编写一个 Spark 应用程序 我需要根据历史数据评估流数据 这些数据位于 SQL Server 数据库中 现在的想法是 spark 将从数据库中获取历史数据并将其保存在内存中 并根据它评估流数据 现在我得到的流数据为 import
  • 如何在R中动态插入带有模式的列?

    这是一个跟进问题 https stackoverflow com questions 73938635 rename a column based on the original columns name r 73938710 noredi
  • 有没有办法在浏览器中编译代码(C/C++)?

    这个问题可能听起来很疯狂 有没有基于浏览器的编译器 本地客户端 https developer chrome com native client是一个沙箱 用于在浏览器中高效运行已编译的 C 和 C 代码 你可以探索这个
  • ReactJS:来自 State 的动态复选框

    我有一个动态元素的集合 所以我事先不知道该集合的内容是什么 我想动态渲染这些复选框 并默认将它们全部选中 您应该能够取消选中这些框 这会在渲染中触发另一个地图功能 所以基本上这是我的过滤器 我在国家设置上苦苦挣扎 我正在考虑以下内容 我想通
  • “此应用程序正在从后台线程修改自动布局引擎”

    我遇到以下错误 此应用程序正在从后台线程修改自动布局引擎 这可能会导致引擎损坏和奇怪的崩溃 每当我尝试将图像视图加载到表视图中时 相关代码如下 override func tableView tableView UITableView ce
  • 在 Gnuplot 中自定义颜色范围

    我有一个运行良好的等值线图 它为不同的值生成等量的颜色 我想要的是在右侧生成标签 以便为每个块提供正确的颜色 当前结果 我想要的是每个块都有这个值 300 100 70 30 10 1 0 编辑 当我添加这段代码时 set cbtics 3
  • 在 C++ 中使用 new 分配大于 2GB 的单个对象(在 Windows 上)

    我使用的是 Windows x64 模式 在 Visual Studio 上使用 MSVC 编译 这new当我这样做时 运算符似乎没有按预期工作 char buf new char 1LLU lt lt 32 但是如果我传入一个变量而不是直
  • 如何在两个PHP文件之间传递变量?

    我在名为 one php 的文件中有以下代码 a href two php Click here for 1 a a href two php Click here for 2 a 现在 当我单击锚标记链接之一时 它会将我带到two php
  • 如何在颤振中在屏幕中央创建标签栏?

    我正在尝试使用 flutter 在屏幕中心创建一个选项卡栏 同时尝试在列中给出 TabBarView 但我陷入了这个错误 请解决这个问题 I flutter 3983 EXCEPTION CAUGHT BY RENDERING LIBRAR
  • 是否可以像 Matlab 一样在 IPython 中显示对象实例变量?

    我正在尝试从 Matlab 转向 Python 而魔法 IPython 很好 Matlab 的一个非常好的功能是您可以在命令行上 通过省略 看到相关对象的实例变量 在 Matlab 中称为属性 这在 python 中可能吗 我猜是通过 IP
  • firebase实时数据库分片规则

    2019 11 03 更新 添加了错误的实时最小再现 https shardautherror firebaseapp com 在 Chrome 中加载链接后 按 ctrl shift i 并选择控制台以查看输出 我已尽力确保这完全符合我原