我遇到的问题是,使用下面显示的以下Firebase规则,经过身份验证的用户可以成功写入数据库,但无法从中读取,因为我在控制台中获得了“拒绝权限”。当我将读取和写入设置为true(公共)时,读取和写入功能都正常工作。我从数据库中读取的代码也显示如下:
private String userID;
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
//Authenticate user
mAuth = FirebaseAuth.getInstance();
mFirebaseDatabase = FirebaseDatabase.getInstance();
myRef = mFirebaseDatabase.getReference();
FirebaseUser user = mAuth.getCurrentUser();
if(mAuth.getCurrentUser() == null){
finish();
startActivity(new Intent(this, MainActivity.class));
}
userID = user.getUid();
public void onDataChange(DataSnapshot dataSnapshot) {
ArrayList<CharSequence> array = new ArrayList<>(Arrays.asList(HomeActivity.this.getResources().getTextArray(R.array.array)));
map = (Map<String, Object>) dataSnapshot.child("users").child(userID).getValue();
int x = 16;
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
array.add(x, key);
x++;
}
规则:
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
示例数据库:
{
"users" : {
"9kV3otdvOXU0ssMZWIdfggrBrj63" : {
"Citrus" : [ "orange", "lime", "mandarin", "lemon" ],
"Fruit" : [ "apple", "banana", "mango" ],
"Meat" : [ "beef", "pork", "lamb", "chicken" ],
"Veg" : [ "tomato", "potato", "cabbage" ]
}
}
}
以下是确切的错误:
W/SyncTree: Listen at / failed: DatabaseError: Permission denied
正如Doug已经评论的那样,如果不查看您将侦听器附加到什么数据,就很难提供帮助(因此,您在其上调用addValueListener
或addListenerForSingleValue事件
的数据库参考
)。但是从侦听器中的这段代码来看,您似乎在监听/
。
dataSnapshot.child("users")
您的用户都没有权限读取/
,因为您只允许他们访问/user/$uid
。你的代码现在不仅违反了你的安全规则,如果它成功了,它将下载比需要更多的数据。
相反,您应该将侦听器附加到JSON树中包含您需要(并且具有读取权限)的所有数据的最低级别。在你的例子中,似乎是/user/$uid
,所以你会这样做:
DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("users");
DatabaseReference userRef = usersRef.child(userID);
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
ArrayList<CharSequence> array = new ArrayList<>(Arrays.asList(HomeActivity.this.getResources().getTextArray(R.array.array)));
map = (Map<String, Object>) dataSnapshot.getValue();
int x = 16;
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
array.add(x, key);
x++;
}
我当前的Android应用程序使用Firebase实时数据库。 我正在与安全规则作斗争,因为我希望只允许单个用户写入数据,同时允许任何经过身份验证的用户读取数据。 我制定了这些规则,但不确定它们是否足够安全。。。 其中“XXXXXXXXXXXXXXXXXXXX”是我希望允许写入数据的指定用户。 用户的uid是常量值吗? 在测试新规则时,单击“模拟”按钮时,“验证”选项管理什么?
好的,我有一个实时数据库连接到一个应用程序,直到今天规则(读写)都设置为真,一切都很好。。。。但每次有消息说 您的安全规则定义为public,因此任何人都可以窃取、修改或删除数据库中的数据 我尝试了几件事,但没有访问数据。。。只有当规则设置为true时,才能访问数据 但有没有办法修改规则,使其更安全 我希望只有少数已知的应用程序(我的应用程序)可以访问此数据
我尝试用规则返回用户聊天列表。所以我不知道对话的id。我尝试了几种方法,但都不起作用,因为你必须知道聊天id。 数据库: 规则: 但当我从react本机应用程序访问时。通过身份验证的用户无法访问聊天记录(uid:3Oi1atf8l2P4Vgsb8tZOGxpUg7q2) *读取失败:错误:权限被拒绝/Chats:客户端没有访问所需数据的权限。 规则: 查询:
我使用以下规则检查只有“管理员”才能写入陷阱部分。 这个很好用。但是如果我把规则改为, 然后我得到了一个权限错误。W/SyncTree:侦听/traps失败:数据库错误:权限被拒绝。 我之所以改变结构,是因为我试图使用validate函数,但由于我无法通过第一个问题,我无法达到验证的程度。 我肯定这是一个新手理解错误,但在尝试了许多排列后,我在这方面进展甚微。您的协助将不胜感激。 更新201606
我在中收到一条消息,告诉我我的项目有不安全的规则。但当我检查它时,我不太明白什么是不安全的。 它显示如下: 我保留了读取访问权限,因为它支持一个网站。所以任何访问该网站的人都应该能够读取数据。 至于写权限,据我所知,我是唯一能写的人。 请注意,我还有第三个系列(CollectionThree),规则中没有提到。这可能是原因吗? 除此之外,我还可以想象,只有web服务器可以获得读取权限,以便将内容提
我试图从Firebase数据库中读取数据,我已经到处阅读和查找,但我已经走到了死胡同。 这就是我所做的一切。 依赖项: 实现'com.google.firebase: Firebase存储: 9.2.1' 实现'com。谷歌。firebase:firebase数据库:9.2。1' 实现'com。谷歌。firebase:firebase授权:9.2。1' 实现'com。谷歌。火基:火基核心:9.2。