允许特定用户写访问

2024-04-16

我的 Firebase 读/写规则有点受阻。我希望我有一种方法可以在检查身份验证时设置断点(没有办法,不是吗?)。

我的问题很简单,我觉得我应该能够更好地理解它。我觉得大部分都是因为没有完全理解规则。此信息是一种在线查看产品的简单方法,并且所有者需要能够添加产品。所以我希望世界能够阅读,登录的人能够写作。

我的数据如下所示:

app
 Users
    email: [email protected] /cdn-cgi/l/email-protection
 product
   0
     name: pizza

还有我的规则:

 {
    "rules": {
      "product":{
        ".read": true,
        ".write":"root.child('Users').child(auth.uid).child('email').val() === '[email protected] /cdn-cgi/l/email-protection'"
      }
    }
}

我不太明白这意味着什么。我真的只是想说,如果用户已登录,则允许写入功能。我希望我能这样".write": "auth"这意味着如果 auth 存在(用户已登录),则让他写入。但我显然不完全理解规则是如何运作的。我正在使用简单的电子邮件/密码身份验证。

如何测试这些规则以及如何向它们传递参数?


我会尽力解释你的.write安全规则,即:

"root.child('Users').child(auth.uid).child('email').val() === '[email protected] /cdn-cgi/l/email-protection'"

这确实不是最简单的规则,Firebase 文档确实很快就深入到了深处。

当我使用 twitter 登录到我的应用程序后,我的代码将得到一个authData告诉它的变量:

 authData
     uid: "twitter:4511241"
     provider: "twitter"
     id: "4511241"

可能还有更多属性,但这应该是它的要点。 authData 通常包含一个具有特定于提供者的属性的子对象,因此在本例中twitter你通常可以在那里找到一些非常有趣的东西。例如 Twitter,用户的 Twitter 名称。

 authData
     uid: "twitter:4511241"
     provider: "twitter"
     id: "4511241"
     twitter:
         userName: "puf"
         email: "[email protected] /cdn-cgi/l/email-protection" // note: this is just an example email address,
                                  // it doesn't exist (as far as I know)

该对象可供我的代码使用,默认情况下它不存储在 Firebase 中的任何位置。

在您的安全规则中,您可以检查相同的结构。但这里只提供了信息的最小子集,仅足以识别用户。这auth 对象的 Firebase 文档 https://www.firebase.com/docs/security/api/rule/auth.html命名这些属性:

provider|使用的身份验证方法(“密码”、“匿名”、“facebook”、“github”、“google”或“twitter”)。

uid|唯一的用户 ID,保证在所有提供商中都是唯一的。

有了这些属性,我们就可以允许特定用户对我们的数据进行写访问。就像我在对你的回答的评论中所说的:

".write": "auth.uid = 'twitter:4511241'"

这将允许我在使用 @puf twitter 帐户登录时写入数据。但不幸的是,它不允许我检查更用户友好的属性,例如电子邮件地址。

常见的做法是创建一个顶级Users节点并添加该节点下所有用户的所有信息(由其 uid 标识)。所以在我上面的例子中:

 Users
     twitter:4511241
         userName: "puf"
         displayName: "Frank van Puffelen"
         email: "[email protected] /cdn-cgi/l/email-protection"
     github:913631
         userName: "puf"
         displayName: "Frank van Puffelen"
         email: "[email protected] /cdn-cgi/l/email-protection"

我在这里留下了提供者和 ID,因为它们对于示例没有提供太多价值

当您知道用户的uid,你可以在这个节点查找他的附加信息。这正是您之前的安全规则的作用:

"root.child('Users').child(auth.uid).child('email').val() === '[email protected] /cdn-cgi/l/email-protection'"

因此,这将从 Firebase 的根目录查找名为 Users 的节点,然后查找uid登录用户的名称以及他/她的电子邮件地址。

检查特定电子邮件地址的一个很酷的事情是它与用户的提供商无关。因此,无论用户是否使用 twitter、github、facebook 或其他受支持的提供商登录,只要他们为每个帐户使用相同的电子邮件地址,他们就能够写入数据。

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

允许特定用户写访问 的相关文章

随机推荐

  • 检查 netcdf linux 库版本

    如何确定我的系统中安装了哪个版本的 netcdf 库 有命令行吗 我尝试搜索 netcdf 发现了一堆文件 但无法确定版本号 有没有命令可以检查已安装的任何版本 我在ubuntu上 netCDF 提供nc config用于此目的的命令行工具
  • 在 Rust 中应该如何进行指针算术?

    我知道答案是 你不应该 但为了争论 如何should你做吧 例如 如果您想编写一个替代方案Vec
  • Apache 服务器上的 React、js

    我正在一个react js项目中工作 我有一个安装了apache服务器的云服务器 我的问题是我可以在 apache 服务器上设置我的反应项目吗 正如达文 泰伦所说 react是一种浏览器技术 除了客户端浏览器从服务器下载应用程序之外 一切都
  • 用户模型中带有 uuid 列的 Laravel Sanctum 不保存 tokenable_id

    我尝试使用Laravel 8 x and Laravel sanctum 2 14 2验证我的 API 和 UUID 作为我的主密钥User model 我的定制PersonalAccessToken model use Illuminat
  • 在 Google Places Apis 中搜索特定城市内的位置

    我正在使用 Google Places Apis 来过滤特定城市内的结果 我能够过滤结果 但它也会显示该城市之外的结果 例如 如果我设置德里市的 LatLngBounds 并搜索纽约市的位置 它还给了我纽约市的结果 但纽约的 LatLng
  • 为什么要实现 IEquatable 接口

    我一直在阅读文章并在一定程度上理解接口 但是 如果我想纠正我自己的自定义 Equals 方法 似乎我可以在不实现 IEquatable 接口的情况下做到这一点 一个例子 using System using System Collectio
  • Python 如何在一行中分配多个变量?

    Python 在一行中分配多个变量实际上执行了哪些步骤 我以前经常做 A 0 A 1 A 1 A 0 来交换 但是最近在分配链表时遇到了一个错误 insert self gt node gt def insert next self nod
  • Spark中连接两个RDD

    我有两个 rdd 一个 rdd 只有一列 其他有两列来连接键上的两个 RDD 我添加了虚拟值 0 是否有其他有效的方法可以使用 join 来执行此操作 val lines sc textFile ml 100k u data val mov
  • conda 内部是如何工作的?

    我搜索了一段时间但找不到满意的答案 康达 http conda pydata org http conda pydata org 在内部工作 任何细节欢迎 此外 由于它与 python 无关并且显然工作得如此良好和流畅 为什么它不被用作像
  • Spring Boot - NoClassDefFoundError:ch/qos/logback/classic/Level

    我创建了一个普通的 Spring Boot 应用程序 1 5 9 RELEASE 但是当我Run As gt Spring Boot App 在 Eclipse Oxygen 中 我明白 SLF4J Failed to load class
  • 在 R Markdown 中将数据框显示为表格

    In knitr我想使用 kable 包添加一个 小 数据框作为表格 output html document r knitr kable mtcars 1 5 1 5 format html 这将返回一个如上所述的紧凑表 同时将其更改为f
  • 机器人框架 - 清除元素文本关键字不起作用

    我们有一个 html 结构的文本字段 如下所示
  • 在 CSS 流布局中自动调整图像大小以模拟 html 表格布局

    我有一个图像 根据屏幕分辨率 它会在 CSS 流布局中下降到看不见的位置 因为我已将其宽度和高度设置为静态值 CSS 流布局中是否有一种方法可以在有人缩小浏览器窗口时自动调整图像大小 我已经在 html table 布局中看到了这一点 并且
  • 具有双重重置的复数累加和

    我试图遵循一些关于何时将数据分组到图表中的规则 我将如何处理这个数据框 A tibble 11 x 8 assay year qtr invalid valid total assays hfr predicted inv
  • 使用 Active Directory 集成身份验证的 Azure SQL 数据库连接无法打开

    我正在尝试使用类似于以下内容的连接字符串通过实体框架连接到 Azure SQL 数据库 Data Source
  • Android Studio - Gradle:如何替换文件中的变量

    我对 Gradle 相当陌生 一直在使用 Eclipse 和 Ant 来完成所有构建 在我们的应用程序中 我们有一个 config properties 文件 位于与 src 和 res 等处于同一级别的 asset 文件夹中 在此文件中
  • 如何强制 Hibernate 将日期返回为 java.util.Date 而不是时间戳?

    情况 我有一个带有 java util Date 类型变量的持久类 import java util Date Entity Table name prd period Cache usage CacheConcurrencyStrateg
  • PyPy 明显慢于 CPython

    我一直在测试我制作的缓存系统 其目的是加速 Django Web 应用程序 它将所有内容存储在内存中 根据 cProfile 我的测试中的大部分时间都花在 QuerySet clone 内 结果证明效率非常低 考虑到实现 这实际上并不奇怪
  • 如何将所有为零的元素移动到数组末尾?

    编写一个函数 该函数接受一个值数组 并将所有为零的元素移动到数组末尾 否则保留数组的顺序 零元素还必须保持它们出现的顺序 零元素由 0 或 0 定义 某些测试可能包含非数字文字的元素 不允许使用任何临时数组或对象 也不允许使用任何 Arra
  • 允许特定用户写访问

    我的 Firebase 读 写规则有点受阻 我希望我有一种方法可以在检查身份验证时设置断点 没有办法 不是吗 我的问题很简单 我觉得我应该能够更好地理解它 我觉得大部分都是因为没有完全理解规则 此信息是一种在线查看产品的简单方法 并且所有者