Firestore - 如何在没有 Auth 的情况下设置安全规则,但基于 Android client/request 数据
Firestore - How to setup security rule without Auth, but based on Android client/request data
在我的例子中,Firestore 数据库如下所示,其中每个 Android 客户端将有一个文档映射到 his/her 设备 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 身份验证,而是想将文档名称 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 设备发送文档名称,如果可以,请建议。
并且还建议它是否是正确的方法,建议您是否有更好的方法?
提前感谢您的帮助。
听起来完全可行。要从 Android 客户端传递 document_sent_from_client
,只需构建一个带有 /document/document_sent_from_client
路径的 DocumentReference
。修改自 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
中的密钥是合理不可猜测的。这种 "security by obscurity" 在没有经过身份验证的用户的情况下相当常见。
在我的例子中,Firestore 数据库如下所示,其中每个 Android 客户端将有一个文档映射到 his/her 设备 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 身份验证,而是想将文档名称 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 设备发送文档名称,如果可以,请建议。
并且还建议它是否是正确的方法,建议您是否有更好的方法?
提前感谢您的帮助。
听起来完全可行。要从 Android 客户端传递 document_sent_from_client
,只需构建一个带有 /document/document_sent_from_client
路径的 DocumentReference
。修改自 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
中的密钥是合理不可猜测的。这种 "security by obscurity" 在没有经过身份验证的用户的情况下相当常见。