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

Firebase实时数据库规则不适用于新用户

叶声
2023-03-14

我的Firebase实时数据库有以下规则:

{
  "rules": {
    "users": {
      "$user_id": {
        ".read": "auth !== null && auth.uid == $user_id",
        ".write": "auth !== null && auth.uid == $user_id",
        ".validate": "data.hasChildren(['calculations', 'daily', 'firstName', 'lastName', 'monthly', 'profileImageUrl', 'uid', 'username', 'weekly'])",
        "calculations": {
          ".validate": "data.isNumber()",
        },
        "daily": {
          ".validate": "data.isNumber()",
        },
        "firstName": {
          ".validate": "data.isString()",
        },
        "lastName": {
          ".validate": "data.isString()",
        },
        "monthly": {
          ".validate": "data.isNumber()",
        },
        "profileImageUrl": {
          ".validate": "data.isString()",
        },
        "uid": {
          ".validate": "data.isString()",
        },
        "username": {
          ".validate": "data.isString()",
        },
        "weekly": {
          ".validate": "data.isNumber()",
        },
        "$other": {
          ".validate": false
        }
      }
    }
  }
}

适用于新用户的旧Firebase实时数据库规则:

{
  "rules": {
    ".read": "auth.uid == $user_id",
    ".write": "auth.uid == $user_id"
  }
}

使用电子邮件和密码进行Firebase身份验证:

// Firebase Authentication to create a user with email and password
auth.createUserWithEmailAndPassword(email, password)
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            val user = auth.currentUser
            // Send an email verification to the user. Only allow them to login after they
            // have verified their email.
            user!!.sendEmailVerification().addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    // Save username, first name, and last name on Firebase Database
                    val uid = auth.uid ?: ""
                    val ref = database.getReference("/users/$uid")
                    val newUser = User(uid, userName, firstName, lastName, 0.0, 0.0, 0.0, 3, "")
                    ref.setValue(newUser)

                    Toast.makeText(
                        this,
                        "Please check your inbox and verify your email address.",
                    Toast.LENGTH_LONG).show()

                    val intent = Intent(this, LoginActivity::class.java)
                    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
                    startActivity(intent)
                }
            }
        }
    }
    // If sign in fails, display a message to the user.
    .addOnFailureListener {
        Toast.makeText(
            baseContext, "Failed to create an account: ${it.message}",
            Toast.LENGTH_LONG
        ).show()
    }

用户类别:

@IgnoreExtraProperties
data class User(
    val uid: String,
    val username: String,
    var firstName: String,
    var lastName: String,
    val daily: Double,
    val weekly: Double,
    val monthly: Double,
    val calculations: Int,
    val profileImageUrl: String
)

这些规则适用于存量用户。但是如果我试图创建一个新用户,这些规则就不起作用了。我无法在数据库中为已经注册的新用户创建新数据。如何解决这个问题?

共有1个答案

姚星腾
2023-03-14

我的猜测是您需要验证新数据是正确的类型。所以:

"calculations": {
  ".validate": "newData.isNumber()",
},

如果您在验证数据时检查Firebase留档,您将看到它们也会检查newData,而不是data(这是指写入操作前的to data)。

 类似资料:
  • 我使用这个firebase规则: 那么我需要更改firebase规则或更改编码吗?

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

  • 我使用以下规则检查只有“管理员”才能写入陷阱部分。 这个很好用。但是如果我把规则改为, 然后我得到了一个权限错误。W/SyncTree:侦听/traps失败:数据库错误:权限被拒绝。 我之所以改变结构,是因为我试图使用validate函数,但由于我无法通过第一个问题,我无法达到验证的程度。 我肯定这是一个新手理解错误,但在尝试了许多排列后,我在这方面进展甚微。您的协助将不胜感激。 更新201606

  • 我在中收到一条消息,告诉我我的项目有不安全的规则。但当我检查它时,我不太明白什么是不安全的。 它显示如下: 我保留了读取访问权限,因为它支持一个网站。所以任何访问该网站的人都应该能够读取数据。 至于写权限,据我所知,我是唯一能写的人。 请注意,我还有第三个系列(CollectionThree),规则中没有提到。这可能是原因吗? 除此之外,我还可以想象,只有web服务器可以获得读取权限,以便将内容提

  • 我有一个数据库: 当用户()在应用程序中注册时,他会填充另一个用户uid(该用户uid具有属性)并将自己的uid添加到他的个人资料中(