Cloud Firestore安全规则存在()无效

时间:2017-11-01 03:50:25

标签: firebase-security google-cloud-firestore

如下所示,当用户存在于" 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;
    }
  }
}

2 个答案:

答案 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")
                    }
                }
            })
}