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
相关产品推荐
相关产品推荐

