如下所示,当用户存在于" users"中时,我想设置一个安全规则。节点,用户可以访问"电子邮件"节点。遇到这种情况,我使用了builtin exists()函数,但它似乎没有正常工作。我刚刚得到"缺少权限或权限不足。"以防万一,用户存在于"用户"节点肯定。
使用get()函数时仍会出现此问题,其中包含此问题(Firestore security rule get() not work)
我完全不确定为什么这条规则不起作用。如果你能给我任何帮助,将不胜感激。
service cloud.firestore {
match /databases/{database}/documents {
match /emails/{email} {
allow read, write: if exists(/databases/$(database)/documents/users/$(request.auth.uid));
}
match /users/{userId} {
allow read, write: if request.auth != null;
}
}
}
答案 0 :(得分:1)
您是否尝试使用get()而不是exists()? 对我来说,这是有效的
allow read, write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data != null
答案 1 :(得分:0)
创建signIn选项时,还应设置" requestIdToken"选项构建器然后在Firestore规则中使用它,例如" request.auth.uid":
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build()
如果您在活动的onActivityResult中获得GoogleSignInAccount(例如),那么您必须将其设置为Firestore单例实例:
private fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) {
AppState.googleAccount = acct
val mAuth = FirebaseAuth.getInstance()
val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, object : OnCompleteListener<AuthResult> {
override fun onComplete(@NonNull task: Task<AuthResult>) {
when (task.isSuccessful) {
true -> // good, continue from this line
false -> showError("error sign in with google account")
}
}
})
}