【问题标题】:prevent a user from writing data to firestore if data exist如果数据存在,则阻止用户将数据写入 Firestore
【发布时间】:2018-01-02 15:05:09
【问题描述】:

我正在制作一个 android 应用程序,当用户在 firebase 上注册帐户时,他会保存他的电子邮件、电话号码和密码。但是当他想登录时,他使用了他的电话号码和密码。由于这个要求,我还必须使电话号码唯一。也有很多方法可以做到这一点,但我的选择是有限的,因为数据库已经被一个工作系统使用,我对其进行更改会导致其他系统不工作。在不影响其他系统的情况下解决我的问题的最佳方法是修改规则以防止用户添加已存在的电话号码。

我的数据库结构是这样的

    users {
        userID {
             name: "John"
             phone: "2342222"
             address: "23rd Avenue"
             email: "email@mail.com"
        }userID 2 {
             name: "Mark"
             phone: "2342222"
             address: "5th Avenue"
             email: "email@mail.com"
        }
   }

现在我的规则是这样的

    service cloud.firestore {
  match /databases/{database}/documents {
     match /Users/{anything=**}  {   
      allow write: if auth != null && !data.exists() && data == request.auth.uid;
    }match /Users/{userId}  {   
      allow read: if request.auth.uid == userId;


// I need a rule maybe here that will allow me write phone number to the database
// If the number doesn't exist in my entire Users database.

    }match /user-compare/{anything=**} {   
    allow read: if true;
    }
  }
}

我试过了

allow write: if request.auth.uid == userId && !request.resource.data.phone in resource.data.phone;

我想确保用户只能在其用户 ID 内读写数据,但我的规则应该是防止重复数据而不是源代码的规则,因为由于其他系统的设置方式,如果多个用户拥有相同的电话号码,它会崩溃,现在我的应用程序是让多个用户使用相同的电话号码的唯一方法。

我知道我可以创建一个新集合来保存这些号码,然后检查该号码是否存在用于注册过程,但如果有人使用其他系统注册,号码将不会出现在这个新集合中。

最好的办法是如果我能写一条规则。我的问题与我所看到的有点不同,我希望我能正确解释。任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 您应该使用 Firebase 身份验证,因为它提供了唯一的手机号码登录功能。除此之外,如果登录成功,您还应该保存该手机号码以及电子邮件和其他用户信息。
  • 是的,这就是所使用的,但是 Firebase SDK 的设置方式,除非我安装了 admin sdk 但我不想使用它,所以最好避免这种情况,因为我无法编辑我将在那里轻松保存的信息。

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


【解决方案1】:

无论我尝试什么,我都无法通过规则解决它,但使用 Firebase Admin SDK 将允许开发人员在服务的身份验证部分写入/编辑/查看信息,这将允许您进行更改并验证它们。你可以了解更多Here。这可以作为对应用程序的依赖项添加,但由于服务的性质,我不认为让用户访问具有管理员权限的应用程序是安全的。但这是一个解决方案,例如当您在办公室拥有应用程序并且用户只能在保存环境中访问它并且可以用于添加更多功能供员工或授权成员使用时。

对我来说,解决我的安全问题的方法是在服务器上安装 Admin SDK。对于我的问题,这可以通过两种方式使用。我可以找到Here 的自定义身份验证,并使用它来使用他们的电话号码和密码登录用户。但我选择做的是制作一个简单的 API 来获取电话号码并检查是否有任何与之关联的电子邮件地址。如果是,则检索电子邮件并将其与密码一起使用,然后使用电子邮件和密码登录。所以基本上它使用通常的电子邮件和密码登录,但用户输入他们的号码和密码。这对我有用,我希望它对处于类似位置的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2020-11-30
    • 2017-04-24
    相关资源
    最近更新 更多