You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Firebase Authentication中阻止指定邮箱域名注册以防范应用滥用

阻止特定后缀邮箱注册的解决方案

我来帮你搞定这个问题——要拦截这些一次性邮箱注册,咱们可以在用户提交注册请求前,先检查邮箱的域名是否在咱们的禁用列表里。下面是具体的实现步骤和修改后的代码:

步骤1:定义禁用域名集合

首先在你的Activity类里,定义一个包含所有要阻止的后缀的集合,用HashSet的话查找效率更高,后续添加新域名也方便:

// 定义禁用的邮箱域名集合,统一小写避免大小写问题
private final Set<String> BLOCKED_DOMAINS = new HashSet<>(Arrays.asList(
    "nezid.com", "xcoxc.com", "jeoce.com", "cdfaq.com"
));

步骤2:添加邮箱后缀检查逻辑

在你的registeruser()方法里,邮箱格式验证通过后、调用Firebase创建用户之前,加入后缀检查的逻辑:

  • 先提取邮箱里的域名部分(@后面的内容)
  • 转成小写避免大小写绕过(比如NEZID.COM也会被拦截)
  • 如果域名在禁用列表里,就提示用户并终止注册流程

步骤3:修改后的完整注册方法

下面是整合了检查逻辑的registeruser()代码,我还补充了原代码里缺失的错误提示,让用户体验更友好:

private void registeruser(){
    String email = editextregistermail.getText().toString().trim();
    String password = editextregisterpass.getText().toString().trim(); // 补上密码获取逻辑,原代码未贴出
    
    if (email.isEmpty()){
        kayıtemail.setError("邮箱不能为空");
        kayıtemail.requestFocus();
        return;
    }
    if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()){
        kayıtemail.setError("请输入有效的邮箱格式");
        kayıtemail.requestFocus();
        return;
    }

    // 新增:检查邮箱域名是否在禁用列表中
    int atIndex = email.lastIndexOf('@');
    if (atIndex == -1) {
        kayıtemail.setError("无效的邮箱格式");
        kayıtemail.requestFocus();
        return;
    }
    String domain = email.substring(atIndex + 1).toLowerCase();
    if (BLOCKED_DOMAINS.contains(domain)) {
        kayıtemail.setError("该类型的邮箱不允许注册,请使用正规邮箱");
        kayıtemail.requestFocus();
        return;
    }

    mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if (task.isSuccessful()){
                User user = new User(name); // 修正原代码里多余的逗号
                FirebaseDatabase.getInstance().getReference("Users")
                        .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                        .setValue(user).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()){
                            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                            if (user != null){
                                user.sendEmailVerification()
                                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {
                                                if (task.isSuccessful()) {
                                                    Intent intent = new Intent(SignUp.this, Login.class);
                                                    startActivity(intent);
                                                    finish();
                                                    mAuth.signOut();
                                                } else {
                                                    String error = task.getException().getMessage();
                                                    Toast.makeText(SignUp.this, error, Toast.LENGTH_LONG).show();
                                                    mAuth.signOut();
                                                }
                                            }
                                        });
                            }
                        } else {
                            String error = task.getException().getMessage();
                            Toast.makeText(SignUp.this, "用户信息保存失败:" + error, Toast.LENGTH_LONG).show();
                            mAuth.signOut();
                        }
                    }
                });
            } else {
                String error = task.getException().getMessage();
                Toast.makeText(SignUp.this, "注册失败:" + error, Toast.LENGTH_LONG).show();
            }
        }
    });
}

额外提示

  • 如果后续需要添加更多禁用域名,直接往BLOCKED_DOMAINS集合里加就行
  • 要是想更灵活,也可以把禁用域名存在Firebase数据库里,这样不用更新APP就能动态修改禁用列表

内容的提问来源于stack exchange,提问作者Muratcan Yıldız

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:37:31