Firebase 安全规则不起作用

Firebase security rules not works

我在 Web 应用程序中使用 Firebase 身份验证,并且我使用 Phone 号码身份验证作为登录应用程序的选项。

function saveUser(fname) {
    var user = firebase.auth().currentUser;
    var newUserRef = firebase.database().ref('users/' + user.uid);
    newUserRef.set({
        fname: fname
    });
}

在以下数据库规则下:

{
  "rules" : {
    ".read"  : false,
    ".write" : false,
    // only authenticated users can write
    "users": {
      ".read": "auth != null",
      "$user_id": {
          "fname": {
            ".read": "auth != null",
            ".write": "auth != null",
            ".validate": "newData.isString() && newData.val().matches(/^[A-Z]{3,}$/)"
          },
      }
    }
  }
}

但是,我一直收到错误消息:

FIREBASE WARNING: set at /users/ypGXpJRM1wdMOuOMf8F7quLnJ073 failed: permission_denied

有没有办法在不改变规则的情况下避免这个错误?

这些规则阻止所有访问:

".read"  : false,
".write" : false,

您可以在 Firebase 数据库规则模拟器工具中轻松测试您的数据库安全规则。

您的规则允许写入的第一个级别在 /users/$uid/fname。但是您的代码试图写入 /users/$uid。由于你在那里没有写权限,数据库拒绝写操作。

您有两种选择来解决此问题:允许写入 /users/$uid,或写入 /users/$uid/fname

允许写入 /users/$uid

要允许写入 /users/$uid,请将您的规则更改为:

"users": {
  ".read": "auth != null",
  "$user_id": {
      ".write": "auth != null",
      "fname": {
        ".read": "auth != null",

事实上,您可能希望确保用户只能编写他们自己的节点,您可以这样做:

"users": {
  ".read": "auth != null",
  "$user_id": {
      ".write": "auth.uid === $uid",
      "fname": {
        ".read": "auth != null",

写信给/users/$uid/fname

您当前的写入代码试图写入您没有权限的地方。由于您只写了 fname,您还可以写入该特定位置以消除错误:

var newUserRef = firebase.database().ref('users/' + user.uid);
newUserRef.child('fname').set(fname);

考虑到数据结构,我可能会修改安全规则。