Firestore - 如何在没有Auth的情况下设置安全规则,但基于Android客户端/请求数据

时间:2017-11-08 15:58:40

标签: android firebase firebase-authentication firebase-security google-cloud-firestore

就我而言,Firestore数据库如下所示,其中每个Android客户端都有一个文档映射到他/她的设备Document_sdfljkhsdio ( specific to Android User 1 )

FireStoreCollection
     Document_sdfljkhsdio  ( specific to Android User 1 ) 
            Collection_xyz 
                  Document_xyz                      
     Document_kjjkssefd  ( specific to Android User 2 ) 
            Collection_xyz 
                  Document_xyz                      
     Document_sqdfwdfsme  ( specific to Android User 3 ) 
            Collection_xyz 
                  Document_xyz  

我没有实施Google Auth,而是希望将文档名称Document_sdfljkhsdio作为请求数据发送,并将其与Firebase控制台中的某些规则相匹配

service cloud.firestore {
  match /databases/{database}/documents {
    match /document/{document_sent_from_client}/ {
      allow read, write: if request.document_sent_from_client == document_sent_from_client;
    }
  }
} 

我不确定是否可以从Android设备发送文档名称,如果是,请建议。

并且还建议如果这是正确的方法,建议你是否有更好的方法?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

听起来完全可行。要从Android客户端传递document_sent_from_client,只需构建一个DocumentReference,其路径为/document/document_sent_from_client。修改自the documentation

DocumentReference docRef = db.collection("document").document("document_sent_from_client");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document != null) {
                Log.d(TAG, "DocumentSnapshot data: " + task.getResult().getData());
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});

但是安全规则在这里没有帮助:如果客户端请求现有文档(即,如果他们知道文档的路径),他们将得到结果。如果他们请求不存在的文档(即,如果他们不知道文档的路径),则任务将失败。

您基本上依赖于document_sent_from_client中的密钥是合理不可知的。这种&#34;安全隐患&#34;在没有经过身份验证的用户的情况下相当普遍。