【问题标题】:Android (Java) | Firestore security rules: allow access only to paths contains user's email安卓 (Java) | Firestore 安全规则:仅允许访问包含用户电子邮件的路径
【发布时间】:2020-07-26 19:25:43
【问题描述】:

我必须设置 Firestore 规则,即只有当“用户”集合中的目录等于用户的电子邮件时,此代码才应插入数据:

FirebaseAuth mAuth = FirebaseAuth.getInstance();
String email = mAuth.getCurrentUser().getEmail()
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("users").document(email).set("Important data");

现在我有以下规则,允许在任何地方进行任何阅读和写作(如果用户被授权):

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

如您所见,我的 Firestore 具有以下结构:

Firestore-root
    |
    --- users (collections)
    |     |
    |     --- email: mymail@google.com(document)
    |            | 
    |            --- Data
    |     --- email: othermail@google.com(document)
    |            | 
    |            --- Data2
    ...
    --- messages (collections)
    |     |
    |     --- email: mymail@google.com(document)
    |            | 
    |            --- message
    |     --- email: othermail@google.com(document)
    |            | 
    |            --- message2

如果用户“mymail@google.com”试图读取“othermail@google.com”的数据,我们如何拒绝访问?

【问题讨论】:

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


    【解决方案1】:

    首先,如果文档是通过用户的 UID 而不是他们的电子邮件来识别的,那会更清晰。如果你能做出改变,一切都会变得更容易,你未来的问题也会更少。您可以简单地使用request.auth.uid 与每个文档 ID 进行比较。

    如果您真的不能使用 UID 并且必须使用电子邮件(这不是很好),您可以使用 request.auth.token.email(请注意,链接的文档建议用户可能不存在电子邮件地址,在在这种情况下,你对那个用户不走运)。

    您必须按其名称来调用每个文档:

        match /messages/{id} {
          allow read, write: if request.auth.token.email == id;
        }
        match /users/{id} {
          allow read, write: if request.auth.token.email == id;
        }
    

    【讨论】:

    • 我必须补充:我通过谷歌认证用户。无论如何,他们有一个独特的电子邮件。仍然使用用户的电子邮件不是一个很好的理由吗?
    • 想象一下,如果您希望将来允许不提供电子邮件的其他身份验证提供商。此外,电子邮件地址不区分大小写。如果有人输入的内容不完全匹配,但仍然是有效的电子邮件,你会怎么做? UID 是通用解决方案,在整个安全规则文档中都可以看到。但这取决于你。
    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 2023-03-13
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多