java - Firebase 实时数据库的权限被拒绝
问题描述
我有这样设置的firebase数据库规则
"Users":{
"$user_id":{
"Name":{
".read":"auth != null",
".write":"auth.uid == $user_id"
},
"Email":{
".read":"auth != null",
".write":"auth.uid == $user_id"
},
"Address":{
".read":"auth != null",
".write":"auth.uid == $user_id"
},
"Photo":{
".read":"auth != null",
".write":"auth.uid == $user_id"
},
"Number":{
".read":"auth.uid == $user_id",
".write":"auth.uid == $user_id"
}
,
"Current":{
".read":"auth != null",
".write":"auth.uid == $user_id"
}
}
}
发出请求的代码
FirebaseAuth mAuth = FirebaseAuth.getInstance();
DatabaseReference userRef = FirebaseDatabase.getInstance().getReference().child(FirebaseConstants.USERS).child(mAuth.getCurrentUser().getUid());
if(mAuth.getCurrentUser() !=null)
{
Log.i("DetailsActivity","User id "+mAuth.getCurrentUser().getUid());
}
else
{
Log.i("DetailsActivity","User not authenticated");
}
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChild(FirebaseConstants.NAME))
{
Name = dataSnapshot.child(FirebaseConstants.NAME).getValue().toString();
UserNameEdittext.append(Name);
}
if(dataSnapshot.hasChild(FirebaseConstants.EMAIL))
{
Email = dataSnapshot.child(FirebaseConstants.EMAIL).getValue().toString();
UserEmailEdittext.append(Email);
}
userInfoProgressbar.setVisibility(View.INVISIBLE);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
userInfoProgressbar.setVisibility(View.INVISIBLE);
Log.i("DetailsActivity","error "+databaseError);
}
});
记录的结果
I/DetailsActivity: User id KfiIFOEGWQZIc5UREqX8qo4Nmkn1
I/DetailsActivity: error DatabaseError: Permission denied
当经过身份验证的用户向 users 节点下的 $user_id 节点发出请求时,会导致Permission Denied错误。Firebase 数据库规则以原子方式工作,但所有读取权限都在检查他是经过身份验证的用户还是用户正在访问他自己的数据。当用户读取自己的数据并且满足所有读取条件但仍然出现Permission Denied错误时。
但是当我尝试单独阅读这些字段中的任何一个时,都没有错误
userRef.child(FirebaseConstants.NAME).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists())
{
Name = dataSnapshot.getValue().toString();
Log.i("DetailsActivity","Name "+Name);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
userInfoProgressbar.setVisibility(View.INVISIBLE);
Log.i("DetailsActivity","error "+databaseError);
}
});
我得到的日志为
I/DetailsActivity: Name elsonjose
任何帮助表示赞赏。提前致谢。
解决方案
假设您有一个默认设置为:
"rules": {
".read": false,
".write": false,
您确实有针对单个字段的规则,但是在读取整个用户记录时您可能会收到“权限被拒绝”,因为您没有为"$user_id"
路径本身设置任何规则。尝试添加:
"Users": {
"$user_id": {
// Allow only authenticated content owners access to their data
".read": "auth != null && auth.uid == $user_id",
".write": "auth != null && auth.uid == $user_id"
}
...
推荐阅读
- ansible - Ansible playbook 用于查找保管库密码的非默认“group_vars”文件夹
- javascript - 在 React 中调用组件时无法访问 props
- c# - 如何使用没有属性的 SelectNode() 检索 XML 节点列表?
- oracle - 如何选择竖线?
- python-3.x - 无法安装 netmiko 或 paramiko
- sql - 尝试在 power bi 中实现 ar 脚本以更新 SQL Server 数据库
- php - 我在尝试上传图片时遇到错误
- express - 从发布请求重定向到新页面(服务器端)
- ios - 将数据列表从服务器填充到 tableview
- python - ximgproc(opencv-contrib 子模块)安装成功,但我收到 AttributeError