2017-09-04 82 views
1

我有一个客户希望能够列出可访问数据的受限电子邮件。因此,任何来到应用程序的人都无法读取/写入任何数据(理想情况下甚至无法登录,但我认为Firebase不可能这样做)。有关如何去做这件事的任何想法?我曾想过收到一系列可接受的电子邮件,并检查他们的电子邮件是否存在于安全规则中,但似乎并不奏效。我在数据库中的以下内容:通过电子邮件限制Firebase用户

"validEmails": ["[email protected]"]

,然后在安全规则:

".read": "root.child('validEmails').val().indexOf(auth.token.email) > -1"

但它看起来就像你不能使用这些安全规则indexOf

也许我需要一个可接受的电子邮件列表,然后当用户注册时检查它们是否在列表中并将其UID添加到接受的列表中?我想我可以通过云端功能来做到这一点?

任何帮助将不胜感激。

干杯

+0

“但这似乎并没有工作”这听起来像你已经尝试了一些应该工作。请编辑您的问题以包含[重现您尝试的最小代码](http://stackoverflow.com/help/mcve)。另请参阅此答案为更通用的“按域锁定数据库”https://stackoverflow.com/questions/36943350/how-do-i-lock-down-firebase-database-to-any-user-from-a -specific-email-domain –

+0

对不起弗兰克,我已经更新了这个问题,以反映我尝试过的代码无效。 –

回答

0

谢谢你们,我落得这样做具有可接受的电子邮件列表:

{ 
    "validEmails": ["[email protected]"], 
    "validUsers": {} 
} 

,然后有一个云功能运行检查,当用户注册,如果他们的电子邮件是有效的电子邮件列表。如果是,则将它们添加到有效的用户列表中,如果不是,则删除新创建的用户。我还设置了数据规则,以便只有validUsers内的用户才能访问数据。

然后前端处理无效用户的重定向等。

+0

请您详细说明您如何“运行云功能来检查用户是否注册了他们的电子邮件是否在有效的电子邮件列表中”?谢谢! –

+1

@AníbalRiveroFirebase允许您编写[云功能](https://firebase.google.com/docs/functions/),它基本上只是运行在node.js服务器上的javascript。他们挂钩到特定的操作并允许您运行代码以响应某些内容。在我上面的示例中,我使用'functions.auth.user()。onCreate()'来检查刚刚注册的用户是否在有效电子邮件列表中包含电子邮件。如果不是,它将删除它们。 –

0

一旦启用火力地堡的认证模块,我相信你不能限制它的电子邮件地址或域。但是,您可以另一种方式保护数据库。如果您的用户已经注册并且您知道他们的uid,那么您可以基于这些限制读取和写入访问。

让我们假装在数据库中有一个acl对象,您可以列出用户及其uid及其读写权限。

这些规则将检查每个请求,并只允许授权用户访问数据。

{ 
    "acl": { 
    [ 
     { 
     "uid: "abc123" 
     "canRead": true, 
     "canWrite": true 
     }, 
     { 
     "uid": "def456", 
     "canRead": true, 
     "canWrite": false 
     } 
    }, 
    "secure": { 
    ".read": { root.child('acl').child(auth.uid).child('canRead').val() == true } 
    ".write": { root.child('acl').child(auth.uid).child('canWrite').val() == true } 
    } 
} 
+0

谢谢,我想知道是否是这种情况。我将不得不重新考虑客户处理这种情况的方法,并围绕这一点开展工作。 –

0

在数据库中允许的用户的电子邮件列表:

"whitelist": { 
    "[email protected]%2Ecom": true, 
    "[email protected]%2Ecom": true 
} 

由于时间不是在按键不准,你需要将它们存储之前转义与时间字符串。

然后在数据库规则:

{ 
    "rules": { 
     "whitelist": { 
      ".read": false, 
      ".write": false 
     }, 
     ".read": "root.child('whitelist').child(auth.token.email.replace('.', '%2E')).exists()", 
     ".write": "root.child('whitelist').child(auth.token.email.replace('.', '%2E')).exists()" 
    } 
} 

用户的电子邮件是通过auth.token.email访问。您需要避开点(. - >%2E)并检查白名单上是否存在密钥。

这些规则不允许任何人读取或写入访问数据库的/whitelist部分。修改只能通过Firebase控制台进行。