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

Firebase实时数据库客户端请求过期后无法写入数据的技术问询

问题描述

我正在开发一款类似小型Spotify的Android学位项目应用,使用Firebase Realtime Database作为后端存储。由于项目中断了很长时间,数据库的客户端请求因为默认的30天闲置限制被自动禁用了。

我已经临时将数据库的读写规则设置为公开可访问(后续会调整为安全规则),用户注册时可以在Firebase Authentication中成功创建账号并登录,但数据无法写入Realtime Database。

注册代码片段

private void registerUser(){ 
    final String email = emailField.getText().toString().trim(); 
    final String username = usernameField.getText().toString().trim(); 
    String password = passwordField.getText().toString().trim(); 
    String confirmPass = confirmPasswordField.getText().toString().trim(); 

    if(username.isEmpty()){ 
        usernameField.setError("Username is required"); 
        usernameField.requestFocus(); 
        return; 
    } 
    if(email.isEmpty()){ 
        emailField.setError("Email is required"); 
        emailField.requestFocus(); 
        return; 
    } 
    if(password.isEmpty()){ 
        passwordField.setError("Password is required"); 
        passwordField.requestFocus(); 
        return; 
    } 
    if(!Patterns.EMAIL_ADDRESS.matcher(email).matches()){ 
        emailField.setError("Please provide valid email"); 
        emailField.requestFocus(); 
        return; 
    } 
    if(password.length() < 6){ 
        passwordField.setError("Password length should be at least 6 characters"); 
        passwordField.requestFocus(); 
        return; 
    } 
    if(!password.equals(confirmPass)){ 
        confirmPasswordField.setError("Passwords do not match"); 
        confirmPasswordField.requestFocus(); 
        return; 
    } 

    progressBar.setVisibility(View.VISIBLE); 
    mAuth.createUserWithEmailAndPassword(email, password) 
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
            @Override 
            public void onComplete(@NonNull Task<AuthResult> task) { 
                if(task.isSuccessful()){ 
                    User user = new User(username, email); 
                    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()){ 
                                    Toast.makeText(RegisterActivity.this, "User has registered successfully", Toast.LENGTH_LONG).show(); 
                                }else{ 
                                    Toast.makeText(RegisterActivity.this, "Registration has failed", Toast.LENGTH_LONG).show(); 
                                } 
                                progressBar.setVisibility(View.GONE); 
                            } 
                        }); 
                } 
            } 
        }); 
}

当前数据库规则

{ 
    "rules": { 
        "users": { 
            ".read": "true", 
            ".write": "true", 
        } 
    } 
}

问题:客户端请求过期后,如何重新启用以恢复数据库写入功能?


解决方案

看起来你遇到了两个关键问题,我们一步步来解决:

1. 重新启用被暂停的Firebase Realtime Database

Firebase会自动暂停30天没有任何客户端流量的Realtime Database实例,恢复步骤如下:

  • 打开Firebase控制台,进入你的项目
  • 在左侧导航栏找到Realtime Database模块并点击进入
  • 你会在页面顶部看到一个明显的提示,说明数据库已被暂停,点击提示中的重新启用或启用数据库按钮
  • 按照控制台指引确认操作,数据库就会恢复正常的客户端访问权限

2. 修正数据库路径大小写不匹配问题

仔细看你的代码和规则,会发现一个容易忽略的细节:

  • 代码中你写入的节点是"Users"(首字母大写):FirebaseDatabase.getInstance().getReference("Users")
  • 但你的规则中配置的是"users"(全小写)

Firebase Realtime Database的节点路径是大小写敏感的,这意味着你的规则只对users节点生效,而代码中写入的Users节点并没有匹配到任何规则,默认会被拒绝读写。

你可以选择以下两种方式修正:

方式一:调整代码中的节点名称

把代码中的"Users"改成"users",和规则保持一致:

FirebaseDatabase.getInstance().getReference("users") // 这里改成小写
    .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
    .setValue(user)

方式二:调整规则覆盖目标节点

如果不想修改代码,就把规则中的"users"改成"Users":

{ 
    "rules": { 
        "Users": { // 改成和代码一致的大写
            ".read": "true", 
            ".write": "true"
        } 
    } 
}

3. 后续建议:设置安全规则

现在你用的是公开读写规则,这在生产环境非常危险,等功能恢复后,建议改成基于用户认证的安全规则,比如只允许认证用户读写自己的数据:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

完成以上步骤后,重新测试注册流程,数据应该就能正常写入数据库了。


内容的提问来源于stack exchange,提问作者Alexandru Contu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:06:06