当前位置: 首页 > 知识库问答 >
问题:

Firebase数据库规则如何检查节点属性值是否与uid进行比较

方奕
2023-03-14

我正在使用firbase数据库,我试图设置规则来限制用户的写访问权限,这些用户的uid与他们试图写的对象的userId节点相匹配,并且仍然允许写来创建一个新对象,例如不存在的新帖子。所以允许新帖子,允许编辑自己的帖子,但是如果帖子存在,但不属于用户,则拒绝写。

比如:

"posts": {
  ".write": "auth !== null && posts.post.userId.val() === auth.uid
}

或者类似的

//where posts.post represents objectRef.objectUpdating
"rules":{
  ".write": " auth !== null && posts.post.userId.val() === auth.uid
}

帖子。postid对象更新如下:

firebase.database().ref('posts').child(id).update(updates)

以下是帖子的外观示例。线程和论坛遵循相同的结构。

  "posts": {
    "-KsjWehQ--apjDBwSBCZ": {
      "edited": {
        "at": 1504037546,
        "by": "ALXhxjwgY9PinwNGHpfai6OWyDu2"
      },
      "publishedAt": 1504035908,
      "text": "some post text",
      "threadId": "-KsjWehQ--apjDBwSBCY",
      "userId": "ALXhxjwgY9PinwNGHpfai6OWyDu2"
    },
    ...{post2},
    ...{etc}
  }

希望这是有意义的,任何帮助都是感激的。

编辑:我得到了它,所以当调用update或create方法时,它会检查数据是否正确。userId与auth相同。uid。更新现有数据现在起作用了。

创建方法不工作虽然,我不知道如何允许更新()创建新的职位或线程像以前没有更新如果userId不匹配auth.uid.

规则如下:

{
  "rules": {
    ".read": true,
    "users": {
      ".indexOn": ["usernameLower", "email"],
      "$user": {
        ".write": "auth !== null && $user === auth.uid"
      }
    },
    "forums": {
      ".write": false
    },
    "categories": {
      ".write":false
    },
    "$resource": {
      "$child": {
        ".write": "(auth !== null && auth.uid === data.child('userId').val()) || data.val() === null"
      }
    }
  }
}

共有1个答案

史宸
2023-03-14

我设法让它运转起来。以帖子为例:

"posts":{
  "$post":{
      ".write": "(auth !== null && auth.uid === data.child('userId').val()) || (!data.exists() && auth !== null)"
   }
}

如果有更好的方法来做这件事,或者如果我是多余的或忽略了什么,请不要犹豫,发表评论,让我知道,我仍然是Firebase的新手,任何输入都是值得赞赏的。

以下是我的规则以供参考。我不清楚的一件事是,我是否必须在我的其他写入规则下面将“.write”设置为false,以防止写入任何其他数据,或者如果默认情况下处理了这些数据。

{
  "rules": {
    ".read": true,
    "users": {
      ".indexOn": ["usernameLower", "email"],
      "$user": {
        ".write": "auth !== null && $user === auth.uid"
      }
    },
    "categories": {
      ".write": false
    },
    "forums": {
      "$forum":{
        "lastPostId": {
          ".write": "auth !== null"
        },
        "threads": {
          ".write": "auth !== null"
        }
      }
    },
    "posts": {
      "$post": {
        ".write": "(auth !== null && auth.uid === data.child('userId').val()) || (!data.exists() && auth !== null)"
      }
    },
    "threads": {
      "$thread": {
        "$child":{
          ".write": "auth !== null"
        },
        ".write": "(auth !== null && auth.uid === data.child('userId').val()) || (!data.exists() && auth !== null)"
      }
    },
    "$resource": {
      "$child": {
        "$child2": {
          ".write": "auth !== null"
        },
        "userId": {
          ".write": "!data.exists()"
        }
      }
    }
  }
}

作为参考,以下是为在数据库中创建新职位而传递给date()的更新:

const updates = {}
        updates[`posts/${postId}`] = post
        updates[`threads/${post.threadId}/posts/${postId}`] = postId
        updates[`threads/${post.threadId}/contributors/${post.userId}`] = post.userId
        updates[`users/${post.userId}/posts/${postId}`] = postId

firebase.database().ref().update(updates)

 类似资料:
  • 问题内容: 我正在将实时数据库与Google的Firebase结合使用,并且正在尝试检查是否存在孩子。 我的数据库结构如下 我想检查room1是否存在。我尝试了以下方法: 在访问它时,返回该房间属性的JSON,但是我如何检查room()是否从那里开始呢? 评论是否需要任何澄清 问题答案:

  • 问题内容: 我是通过Android(Java)刚接触Firebase的,并且想知道如何检查用户是否已存在以下格式的数据库中: 例如,按下按钮后,我想检查Firebase以查看用户名“ Michael”是否存在(对象michael中的第一级michael-而不是“ michael”。 谢谢 问题答案: 使用方法或onDataChange中的SingleValueEvent

  • 我正在努力解决firebase实时数据库的安全规则。我的数据库结构如下: 第一层是聊天。第二层是聊天伙伴(包含聊天伙伴用户ID的串联字符串)。在第三层,你有这些信息。在最后一个级别上有变量datetime、userid和message。 我的问题是,我如何进入第二个子节点,例如检查auth.uid是否在连接的字符串中。我的想法是,如果用户ID在聊天伙伴字符串中,则给予用户读取权限,以确保只有聊天伙

  • 我有一个相当简单的情况,我想在我的规则条件中检查一个属性是否为空。 我在调试中跟踪了这一点。正在插入一个Fact,属性为null,但规则仍然会触发。控制台输出如下。 如果我将条件更改为,则规则不会触发。所以它似乎与我所期望的完全相反。 我们确实有一个使用函数的解决方法,但它有点难看,我不明白为什么它首先不起作用。 编辑1 口水版本是5.3.0。 事实是通过另一条规则加载的,该规则使用来自的和服务方

  • 问题内容: 我试图找到最大的立方根,即整数,小于12,000。 我不确定如何检查它是否是整数!我可以将其转换为字符串,然后使用索引来检查最终值,看看它们是否为零,但这似乎很麻烦。有没有更简单的方法? 问题答案: 要检查浮点值是否为整数,请使用以下方法: 该方法已添加到Python 2.6中的类型中。 请考虑在Python 2中为(整数操作数的底数除法!),并且浮点算术可能不精确(a是使用二进制分数

  • 我尝试用规则返回用户聊天列表。所以我不知道对话的id。我尝试了几种方法,但都不起作用,因为你必须知道聊天id。 数据库: 规则: 但当我从react本机应用程序访问时。通过身份验证的用户无法访问聊天记录(uid:3Oi1atf8l2P4Vgsb8tZOGxpUg7q2) *读取失败:错误:权限被拒绝/Chats:客户端没有访问所需数据的权限。 规则: 查询: