【发布时间】:2020-04-27 12:00:09
【问题描述】:
我正在使用 Cloud Firestore,我正在尝试更改我的安全规则。这是我想要的条件
只有电话号码在教师集合中的任何文档中的用户才能阅读教师集合中唯一的他/她的文档
这是我写的代码
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /Teachers/{teachers}{
allow read: if((resource.data.mobno == request.resource.data.mobno) )
allow update:if((request.resource.data.mobno == resource.data.mobno))
}
}
}
这是客户端查询
Teacherref = FirebaseFirestore.getInstance().collection("Teachers");
Teacherref.whereEqualTo("mobno",mobilecredential).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
if(!queryDocumentSnapshots.getDocuments().isEmpty()){
for(QueryDocumentSnapshot data:queryDocumentSnapshots){
teacherdata=data.toObject(TeacherLoginModel.class);
if(TextUtils.isEmpty(teacherdata.getStatus()))signinuser(data);
else if(teacherdata.getStatus().equals("signout"))signinuser(data);
else {Toast.makeText(Signin.this, "You Are Already logged In Different Phone", Toast.LENGTH_SHORT).show();
predialog.dismiss();}
}
}
else{
predialog.dismiss();
Toast.makeText(Signin.this,"Please Check Your Credentials ", Toast.LENGTH_SHORT).show(); }
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(Signin.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
【问题讨论】:
-
您是否遇到任何错误?或者应用程序没有按您的意愿运行?
-
显示权限被拒绝
-
你可以试试这个路径吗?
DocumentReference Teacherref = FirebaseFirestore.getInstance().document("Teachers/"+<current_user_uid>);而不是whereEqualTo?我假设这个查询是由用户自己完成的。然后使用 if-exists 逻辑? -
它不会工作,因为这个人没有登录但实际上只有那些老师可以在应用程序中注册,其号码已经存在于数据库中。这就是为什么我首先检查用户输入的号码数据库中是否存在,如果存在,他可以注册
-
如果您希望未经身份验证的用户以某种方式访问您的应用,我强烈建议您使用 Firebase 云功能。当用户输入电话号码时,在 Firebase 实时数据库中创建该电话号码的节点,然后进一步使用
onCreate()触发器来运行您的应用程序。这样您就不必担心 Firestore 规则以及来自客户端的数据库路径。
标签: firebase google-cloud-firestore firebase-security