如何保护 Firebase 数据库中用户和管理员的访问安全?

2024-02-10

我使用 Redux-Saga 作为中间件。我通过查询将参数传递给 Firebase 数据库,但无法在数据库端访问它。

Query:::

database.ref("workouts")
.child(userId)
.once("value")
.then(snapshot => {
 console.log("onSuccess:", snapshot.ref, snapshot.val());
 resolve(snapshot.val());
 })
.catch(function(error) {
 console.log("Error fetching document: ", error);
 reject(error);
 });

UserId 是我从 localStorage 获取并使用“.child(userId)”通过查询发送到数据库的值

查询:::(管理员)

database.ref("workouts")
.once("value")
.then(snapshot => {
 console.log("onSuccess:", snapshot.ref, snapshot.val());
 resolve(snapshot.val());
 })
.catch(function(error) {
 console.log("Error fetching document: ", error);
 reject(error);
 });

数据库中的规则::::

{
"rules": {
         "workouts": {
          // grants write access to the owner of this user account || the user role is equal to  admin
          // grants read access to the owner of this user account || the user role is equal to  admin
".read":"(data.exists() && auth.uid != null && data.child(auth.uid).exists()) ||root.child('users').child(auth.uid).child('role').val() == 'admin'",
".write":"data.exists() ||root.child('users').child(auth.uid).child('role').val() == 'admin'"
                     }
         }
}

我尝试过 [query.equalTo] 和 [data.child(auth.uid).val()] 方法来访问该值,但没有得到任何结果。

用于锻炼的 JSON:::::

"workouts" : {
"6OiasllKwVSjjRfrCarMAjhkKAH2" : {
  "-LD3nNIKw9Yk3HcoAL0-" : {
         "exercises" : [ {
          "muscleGroup" : "Chest",
          "name" : "Incline Dumbbell Fly",
          "sets" : [ 0, 0, 0, 0, 0 ],
          "type" : "reps"
        } ],
        "name" : "Force Set",
        "reps" : [ "5", "5", "5", "5", "5" ],
        "type" : "Weights"
       }]
    },
    "workoutName" : "My Test workout"
  }

用户的 JSON:::::

 "users" : {
     "6OiasllKwVSjjRfrCarMAjhkKAH2" : {
     "email" : "[email protected] /cdn-cgi/l/email-protection",
     "role" : "user",
     "uid" : "6OiasllKwVSjjRfrCarMAjhkKAH2"
       }
     }

非常感谢任何形式的帮助。

提前非常感谢您。

编辑:::: 添加了管理员查询。我想在管理员的情况下获取集合中的所有可用数据。


我想我明白出了什么问题。您的 JSON 似乎包含用户的所有锻炼,如下/workouts/$uid。您的规则尝试让用户访问所有/workouts,而不仅仅是他们自己的。

解决方案是将规则移至树中下一层:

{
  "rules": {
    "workouts": {
      // grants access to the owner of this user account || the user role is equal to  admin
      "$uid": {
        ".read":"auth.uid == $uid || root.child('users').child(auth.uid).child('role').val() == 'admin'",
      },
      ".write":"data.exists() || root.child('users').child(auth.uid).child('role').val() == 'admin'"
    }
  }
}

另请参阅有关保护用户数据的文档 https://firebase.google.com/docs/database/security/user-security#section-structuring-db,其中有一个很好的简单示例。

Update: 如果你想允许管理员阅读/workouts每个用户都能够在下面阅读自己的锻炼情况/workouts/$uid,那么你需要这些规则:

{
  "rules": {
    "workouts": {
      // grants access to the owner of this user account
      "$uid": {
        "read": "auth.uid == $uid",
      },
      // grants access to the admin
      ".read": "root.child('users').child(auth.uid).child('role').val() == 'admin'",
      ".write": "data.exists() || root.child('users').child(auth.uid).child('role').val() == 'admin'"
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何保护 Firebase 数据库中用户和管理员的访问安全? 的相关文章

随机推荐

  • 在 R (CRAN) 中创建和裁剪网格

    我需要在 gstat 库中创建一个用于空间插值的掩模网格 具体来说 我有随机分布的不同采样点 我需要创建包围这些点的最小凸多边形 然后 我必须创建一个空间网格 该网格应由计算的外壳裁剪 以将插值限制在该多边形的范围内 如果有人能向我解释详细
  • Java限制资源使用

    有没有办法限制java使用的核心数量 同样 是否有可能限制该核心的使用量 您可以在 Linux 上使用任务集 您还可以降低进程的优先级 但除非 CPU 繁忙 否则进程将获得尽可能多的 CPU 我有一个将线程专用于核心的库 称为 Java T
  • 启动时自动运行 Jetty

    我正在尝试让 Jetty 在我的 Ubuntu 上自动启动 我已经完成了这些命令 cp opt jetty bin jetty sh etc init d update rc d jetty sh defaults 但是当我运行它时 我得到
  • sqlalchemy 中的scoped_session(sessionmaker()) 或普通sessionmaker() ?

    我在我的网络项目中使用 SQlAlchemy 我应该用什么 scoped session sessionmaker 或普通sessionmaker 为什么 或者我应该使用其他东西 model py from sqlalchemy impor
  • 将十进制数转换为二进制数

    我目前正在阅读 Charles Petzold 的书 Code 在其中 他解释了如何使用以下模板将十进制数转换为二进制数 128 64 32 16 8 4 2 1 在书中 他对如何使用模板的解释如下 将整个十进制数 小于或等于255 放入上
  • 将图像保存到数据库mysql中

    我的客户在 php mysql 中创建了一个脚本 将图像直接保存在数据库中 每个图像都有这样的 url www example com image php id 421 您认为这是一个非常错误的解决方案 我应该重建所有网站吗 每天约有 10
  • 如何用 C++ 编写文本编辑器[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我断断续续地学习了 C 好几次 但从未使用它编写过真正的应用程序 很长一段时间我一直认为编写一个文本编辑器会是一件非常有趣的事情 现在我正
  • 通过 S3 从 Amazon CloudFront 提供 gzip 压缩的 CSS 和 JavaScript

    我一直在寻找使我的网站加载速度更快的方法 我想探索的一种方法是更多地利用 Cloudfront 由于 Cloudfront 最初并未设计为自定义源 CDN 并且它不支持 gzip 压缩 因此到目前为止 我一直在使用它来托管所有图像 这些图像
  • 如何将焦点设置到下一个输入框 onkeyup 像选项卡功能

    我正在动态创建输入框以捕获某个单词的输入 例如 H E L L O 表示 你好 我想在每个输入框中输入单个字符后将焦点设置到下一个输入框 我该怎么做
  • 将应用程序安装到越狱的ios根目录的Applications文件夹中

    当我将 myapp app 放入 ios5 根目录的应用程序文件夹中时 但它无法工作 为什么 但我发现cydia可以正常工作 在main m中添加setuid 0 and setgid 0 正常构建应用程序 然后将可执行文件复制并粘贴到 a
  • golang中无法获取cookie过期时间

    我正在设置一个新的 cookie func f1 w http ResponseWriter r http Request expire time Now AddDate 0 1 0 cookie http Cookie token tok
  • Python:为特定函数调用设置内存限制

    在Python脚本中 我想为某个函数调用设置内存限制 我在看如何限制堆大小 https stackoverflow com questions 2308091 how to limit python heap size 但是 我不想限制整个
  • check_input(x) 中的错误:输入必须是任意长度的字符向量或字符向量列表,每个字符向量的长度为 1

    使用 tidytext 包 我想将我的 tibble 转换为每行每文档一个令牌 我将小标题的文本列从因子转换为字符 但仍然遇到相同的错误 text df lt tibble line 1 3069 text text 我的小标题看起来像这样
  • 在访问表单上实施 Google 地图

    我正在寻求开发集成了 Google 地图的 MS Access 表单的帮助 以便我们的司机可以根据 Google 地图查找车站并确切地知道它所在的位置 I have wireframed basic mockup it like this
  • Flexbox 中的 SVG 会扰乱其他元素的高度

    我正在尝试使用一个 svg 元素 它可以根据 Flexbox 中的容器大小调整大小 但由于某种原因 它会弄乱 svg 下面的 div 带有文本 的大小 调整浏览器窗口大小时会发生多少变化 以下是我为此使用的基本 CSS 属性 layout
  • 如何在 Windows 服务器上使用 phpdbg 获取 PHP 代码覆盖率?

    既然我还有PHPUnit PHP 代码覆盖率和 Xdebug 的问题 https stackoverflow com questions 40386345 phpunit or its code coverage driver cannot
  • 如何将AWS API网关阶段指向特定的lambda函数别名?

    所以根据AWS文档 而不是在 Lambda 函数中使用 Amazon 资源名称 ARN 事件源映射 您可以使用别名 ARN 这种方法意味着 您不需要更新事件源映射 升级新版本或回滚到以前的版本 我有 AWS lambda 函数pets我创建
  • iPhone OS 实用应用程序 - 翻转视图和主视图通信

    我目前正在开发 iPhone 2 1 应用程序 我是 Objective C 的新手 有 Java 背景 我的应用程序以 Xcode 中可用的实用应用程序模板和 iPhone SDK 为基础 目前我有一些控件 例如UISlider和文本框
  • ssh2_auth_pubkey_file 身份验证总是失败

    我正在尝试使用 PHP 的 ssh2 函数连接到另一台机器 我知道 ssh 密钥是在没有密码的情况下创建的并且已正确分发 我可以ssh user host在我机器上的终端中连接到服务器 PHP 函数尝试使用 ssh 密钥文件连接到 IP 地
  • 如何保护 Firebase 数据库中用户和管理员的访问安全?

    我使用 Redux Saga 作为中间件 我通过查询将参数传递给 Firebase 数据库 但无法在数据库端访问它 Query database ref workouts child userId once value then snaps