我的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
)
这些规则适用于存量用户。但是如果我试图创建一个新用户,这些规则就不起作用了。我无法在数据库中为已经注册的新用户创建新数据。如何解决这个问题?
我的猜测是您需要验证新数据是正确的类型。所以:
"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添加到他的个人资料中(