Android Firebase setValue() 权限被拒绝
Android Firebase setValue() Permission Denied
这是在 firebase 上定义规则的方式:
{
"rules": {
"users": {
".read": true,
"$user_id": {
".write": "auth.uid === $user_id",
".read" : true
}}}}
我已经像下面一样使用 setValue() 在我的寄存器 activity 中成功写入了新用户信息,并且还使用 push().setValue() 添加了新评论,每次我都没有身份验证问题。新用户直接写到 http://DB/users/ 而评论添加得很深。
这是一个代码片段,我的代码点击了日志:无法保存数据。每次。
AuthData authData = newRef.getAuth();
if (authData != null) {
Log.v(LOG_TAG, "Auth as " + authData.getUid());
Map<String, Object> newEntry = new HashMap<String, Object>();
newEntry.put("Name", name);
newEntry.put("Description", desc);
newEntry.put("DueDate", date);
newEntry.put("Status", 0);
newRef.setValue(newEntry, new Firebase.CompletionListener() {
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase) {
if (firebaseError != null) {
Log.v(LOG_TAG, "Data could not be saved. " + firebaseError.getMessage()); //Hits here every time.
} else {
Log.v(LOG_TAG, "Data saved successfully. Finishing activity...");
finish();
}
}
});
;
}
else{
Log.v(LOG_TAG, "No authdata");
}
希望我提供了足够的信息,我猜问题出在 security/rules 中,但任何 direction/guidance 都将不胜感激。谢谢。
我的数据库参考路径有误。
我太纠结于这一点了,这对我有帮助。
首先,有两种类型的用户可以从 firebase 访问数据库
- 授权
- 未经授权
默认情况下,它被设置为未授权,但他们没有任何权限,既没有 read 也没有 write,所以最初如果你尝试执行任何操作你得到 permission denied error.
如何更改它以满足您的要求?
解法:
在“数据库”部分下,转到“规则”选项卡。 URL 将与您的项目名称类似。
https://console.firebase.google.com/project/project-name/database/rules
你会在这里看到这样的东西:
{
"rules": {
".read": "auth != null", //non-authorised users CANT read
".write": "auth != null" //non-authorised users CANT write
}
}
只需将其更改为
{
"rules": {
".read": "auth == null", //even non-authorised users CAN read
".write": "auth == null" //even non-authorised users CAN write
}
}
根据您的要求更改此项。编码愉快:)
对于遇到这个问题的人,不要忘记更改默认给我们 firebase 的 "type of database",应该注意的是有 2 种类型的数据库,一种是 Cloud Firestore 和另一个 RealTime Database
要回答这个问题,请确保您使用的是实时数据库:
然后编辑规则:
显然这种规则配置应该只用于开发环境,不要忘记在生产环境中更改规则。
这是在 firebase 上定义规则的方式:
{
"rules": {
"users": {
".read": true,
"$user_id": {
".write": "auth.uid === $user_id",
".read" : true
}}}}
我已经像下面一样使用 setValue() 在我的寄存器 activity 中成功写入了新用户信息,并且还使用 push().setValue() 添加了新评论,每次我都没有身份验证问题。新用户直接写到 http://DB/users/ 而评论添加得很深。
这是一个代码片段,我的代码点击了日志:无法保存数据。每次。
AuthData authData = newRef.getAuth();
if (authData != null) {
Log.v(LOG_TAG, "Auth as " + authData.getUid());
Map<String, Object> newEntry = new HashMap<String, Object>();
newEntry.put("Name", name);
newEntry.put("Description", desc);
newEntry.put("DueDate", date);
newEntry.put("Status", 0);
newRef.setValue(newEntry, new Firebase.CompletionListener() {
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase) {
if (firebaseError != null) {
Log.v(LOG_TAG, "Data could not be saved. " + firebaseError.getMessage()); //Hits here every time.
} else {
Log.v(LOG_TAG, "Data saved successfully. Finishing activity...");
finish();
}
}
});
;
}
else{
Log.v(LOG_TAG, "No authdata");
}
希望我提供了足够的信息,我猜问题出在 security/rules 中,但任何 direction/guidance 都将不胜感激。谢谢。
我的数据库参考路径有误。
我太纠结于这一点了,这对我有帮助。
首先,有两种类型的用户可以从 firebase 访问数据库
- 授权
- 未经授权
默认情况下,它被设置为未授权,但他们没有任何权限,既没有 read 也没有 write,所以最初如果你尝试执行任何操作你得到 permission denied error.
如何更改它以满足您的要求?
解法:
在“数据库”部分下,转到“规则”选项卡。 URL 将与您的项目名称类似。
https://console.firebase.google.com/project/project-name/database/rules
你会在这里看到这样的东西:
{
"rules": {
".read": "auth != null", //non-authorised users CANT read
".write": "auth != null" //non-authorised users CANT write
}
}
只需将其更改为
{
"rules": {
".read": "auth == null", //even non-authorised users CAN read
".write": "auth == null" //even non-authorised users CAN write
}
}
根据您的要求更改此项。编码愉快:)
对于遇到这个问题的人,不要忘记更改默认给我们 firebase 的 "type of database",应该注意的是有 2 种类型的数据库,一种是 Cloud Firestore 和另一个 RealTime Database
要回答这个问题,请确保您使用的是实时数据库:
然后编辑规则:
显然这种规则配置应该只用于开发环境,不要忘记在生产环境中更改规则。