firebase 安全权限不起作用

标签 firebase firebase-security firebase-authentication

我的 firebase 中存储了以下数据:

firebaseRoot
    admins
        simplelogin:1: 
    users
        simplelogin:1
            email: abc@xyz.com
            picture: csd
            provider: password
            uid: simplelogin:1
        simplelogin:2
            email: abc1@xyz.com
            picture: zsd
            provider: password
            uid: simplelogin:1

以及以下安全规则:

{
  "rules": {
    "admins": {
      ".read": "root.child('admins').child(auth.uid).val() === true",
      ".write": "root.child('admins').child(auth.uid).val() === true"
    },
    "users": {
      "$user":{
        ".read": "$user === auth.id || root.child('admins').child(auth.uid).val() === true",
        ".write": "$user === auth.id"
      }
    }
  }
}

我的授权要求如下。

  1. 管理员只能由现有管理员读取和添加。这有效。
  2. 管理员可以读取所有用户,但不能写入用户数据。
  3. 用户可以读取和更新自己的用户数据。

目前,根据上述规则,我无法读取管理员和登录用户的用户数据。我收到以下错误消息。请提供您的帮助。谢谢。

var rootRef = new Firebase('https://xxxxx.firebaseio.com/');
var users = rootRef.child('users');
users.on('value', function(snap) {
console.log(snap.key(), snap.val());
}, function(error) {
console.log(error);
});

错误:

Error: permission_denied: Client doesn't have permission to access the desired data.

最佳答案

Firebase 安全规则有两个陷阱:

  1. rules cascade

    这意味着一旦您向某人授予 JSON 结构中某个级别的(读或写)访问权限,您就无法再在较低级别上立即获取该访问权限

  2. rules are not filters

    这意味着只有当您对节点中的所有数据具有读取访问权限时,您才能读取该节点。如果您只有部分数据的读取权限,则完整数据的读取操作将会失败。

在您的安全规则中,您仅授予读取 users 下(部分)子项的权限。因此尝试读取整个 users.on('value' 将会失败。

您可以通过向管理员授予 .read 访问 users 节点的权限来解决此问题。

    "users": {
      ".read": "root.child('admins').child(auth.uid).val() === true",
      "$user":{
        ".read": "$user === auth.id",
        ".write": "$user === auth.id"
      }
    }

关于firebase 安全权限不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30732705/

相关文章:

firebase - Firestore 规则使用 Flutter 客户端验证时间戳

Firebase 安全规则 : "ruleset uses old version", 当前版本是什么?

ios - 当我向 NavigationController 呈现 "whose view is not in the window hierarchy!"错误时

ios - 在从函数返回之前等待 Firebase 加载

angular - 无法添加域。它可能已经注册到另一个项目

javascript - 使用 javascript 创建用户帐户时的 Firebase 安全问题

ios - 什么是 AuthStateDidChangeListenerHandle?

Firebase 身份验证与 Firebase 管理员

javascript - 检索上次发送的消息

ios - 从 Firebase 解析数据时无法成功重新加载 UITableView 元素