【问题标题】:Cloud Firestore Security Rule exists() doesn't workCloud Firestore 安全规则存在()不起作用
【发布时间】:2017-11-01 03:50:24
【问题描述】:

如下图,我想设置一个安全规则,当用户存在于“users”节点时,该用户可以访问“email”节点。遇到这种情况,我使用了内置的 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;
    }
  }
}

【问题讨论】:

    标签: firebase-security google-cloud-firestore


    【解决方案1】:

    您是否尝试过使用 get() 而不是 exists()? 对我来说这是有效的

    allow read, write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data != null
    

    【讨论】:

    • 感谢您的回复。我试过这个,但不起作用。除了一些特定的节点,get()/exist() 在我的 Firestore 上运行良好。但是我一直遇到这种问题没有按预期工作......不知道为什么。
    【解决方案2】:

    当您创建登录选项时,您还应该将“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")
                        }
                    }
                })
    }
    

    【讨论】:

    • 非常感谢您提供的精确代码。我已经创建了令牌并且“request.auth.uid”在其他节点中正常工作,除了这个麻烦一些节点。看起来很连贯……我猜我做错了什么。
    • 从玩具安全规则我可以​​说你想让任何现有用户访问任何电子邮件?是真的吗?
    • 如果您将提供用于在 Firestore 中创建用户的代码 - 分析您的规则将非常清楚
    • 您已经检查过 FirebaseAuth.getInstance().currentUser.uid 是否存在于 firestore 数据库中?
    猜你喜欢
    • 2021-11-22
    • 2019-09-27
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2021-05-12
    • 2019-09-06
    相关资源
    最近更新 更多