我如何只允许特定的电子邮件登录我的页面

时间:2019-02-03 09:00:29

标签: javascript html firebase firebase-authentication

有两个方面,管理员和用户。我正在Firebase中为用户和管理员使用相同的数据库。这意味着在我的Firebase身份验证中注册的用户可以登录到管理网页。我如何只允许特定管理员的电子邮件登录“管理员”页面。

例如: 管理员的电子邮件为admin@admin.com

用户有各种电子邮件,例如123 @ gmail.com,222 @ gmail.com等。

我想要的只是允许admin@admin.com能够登录到Admin页面,但限制用户电子邮件的登录名才能登录到Admin页面。

3 个答案:

答案 0 :(得分:1)

我假设在后端,您的应用程序是正确安全的,即您的数据库中有安全规则,该规则仅允许具有“ admin”配置文件/角色的用户读取或写入“ admin”数据库中的数据。

如果不是这种情况,则必须设置正确的安全规则,因为仅从前端角度保护Firebase实例是不够的,因为对应用程序进行反向工程并不是很困难代码并编写一些与后端交互的JavaScript代码。为此,您可以使用Custom Claims

因此,按照这种假设,这意味着您需要以仅管理员用户可以看到管理员屏幕的方式来调整前端。

最好的答案之一是再次使用“自定义声明”,如此处https://firebase.google.com/docs/auth/admin/custom-claims#access_custom_claims_on_the_client所述(“访问客户端上的自定义声明”一节),并且在此Firebase官方视频中:https://firebase.google.com/docs/auth/admin/custom-claims#access_custom_claims_on_the_client


请注意,尝试基于用户的电子邮件域阻止用户可能不是一个好的解决方案,因为用几行JavaScript代码轻松地以用户身份使用诸如what @ admin之类的邮件注册到Firebase项目。 com或任何其他电子邮件(使用createUserWithEmailAndPassword

答案 1 :(得分:1)

使用Javascript,一个简单的解决方案是在emailsplit @字符串,这将返回一个子字符串数组,并比较第二部分,即域。然后,只有条件为true时,您才可以使其余代码条件正常。

一个例子是:

const allowedEmailDomain = 'admin.com';

const email = 'test@admin.com';

if (email.split('@')[1] === allowedEmailDomain) {
  // do something, we accept this email
} else {
  // return an error or do nothing
}

答案 2 :(得分:0)

只需将其他所有域都屏蔽为@ admin.com。

$allowed_domains = array("admin.com");
$email_domain = array_pop(explode("@", $email));
if(!in_array($email_domain, $allowed_domains)) {
    // Not an authorised email 
}

很简单。为允许的域创建一个数组,用@爆炸,获取数组的最后一个元素,然后检查它是否存在于允许的域数组中。