Firebase 数据库的匿名身份验证权限被拒绝
Permission denied on anonymous authentication for Firebase Database
我有 firebase 数据库,它工作正常,直到规则设置为:
"rules": {
".read": true,
".write": false
}
但现在我需要启动我的应用程序,所以我不希望我的数据库对所有人开放。这就是为什么我将数据库规则更改为:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
我在我的安卓应用程序中设置了匿名身份验证,但权限被拒绝的错误一直显示。顺便说一句,Anonymouse 身份验证在模拟器中工作正常。
我是这样实现的:
public void fireBaseAuthenticate(final Context context) {
mAuth = FirebaseAuth.getInstance();
mAuth.signInAnonymously()
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// debugger comes here, so Authentication is successful
} else {
// If sign in fails, display a message to the user.
}
}
});
}
public void load(final Context context) {
fireBaseAuthenticate(context);
database = FirebaseDatabase.getInstance();
databaseReference = database.getReference();
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot categorySnaps : dataSnapshot.getChildren()) {
RetailChain retailChain = new RetailChain();
retailChain.setName(categorySnaps.getKey());
for (DataSnapshot subMenuSnaps : categorySnaps.getChildren()) {
for (DataSnapshot itemSnaps : subMenuSnaps.getChildren()) {
for (DataSnapshot productSnaps : itemSnaps.getChildren()) {
Product product = productSnaps.getValue(Product.class);
productList.add(product);
}
}
}
retailChain.setProducts(productList);
retailChainList.add(retailChain);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w("database error: ", "onCancelled", databaseError.toException());
}
});
}
为 singleValueEvent
添加侦听器后,OnCancelled
被调用。
那么为什么拒绝许可呢?
编辑:
错误日志:
com.google.firebase.database.DatabaseException: Firebase Database error:
Permission denied
at com.google.firebase.database.DatabaseError.toException(Unknown Source)
at home.gio.calorieplanner.main.Main.onCancelled(Main.java:205)
at com.google.firebase.database.Query.onCancelled(Unknown Source)
at com.google.android.gms.internal.zzbpx.zza(Unknown Source)
at com.google.android.gms.internal.zzbqv.zzZT(Unknown Source)
at com.google.android.gms.internal.zzbra.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
当您设置规则 "auth != null"
时,这意味着用户在完成登录之前无法访问数据库。
而登录过程是一个asynchronous
,这意味着完整的监听器不会立即调用。
要解决您的问题,只需将读取数据库的代码移到完整的侦听器上即可。
public void load(final Context context) {
fireBaseAuthenticate(context);
}
public void fireBaseAuthenticate(final Context context) {
mAuth = FirebaseAuth.getInstance();
mAuth.signInAnonymously()
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// load the data
loadFromDB();
} else {
// If sign in fails, display a message to the user.
}
}
});
}
private void loadFromDB(){
database = FirebaseDatabase.getInstance();
databaseReference = database.getReference();
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot categorySnaps : dataSnapshot.getChildren()) {
RetailChain retailChain = new RetailChain();
retailChain.setName(categorySnaps.getKey());
for (DataSnapshot subMenuSnaps : categorySnaps.getChildren()) {
for (DataSnapshot itemSnaps : subMenuSnaps.getChildren()) {
for (DataSnapshot productSnaps : itemSnaps.getChildren()) {
Product product = productSnaps.getValue(Product.class);
productList.add(product);
}
}
}
retailChain.setProducts(productList);
retailChainList.add(retailChain);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w("database error: ", "onCancelled", databaseError.toException());
}
});
}
我有 firebase 数据库,它工作正常,直到规则设置为:
"rules": {
".read": true,
".write": false
}
但现在我需要启动我的应用程序,所以我不希望我的数据库对所有人开放。这就是为什么我将数据库规则更改为:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
我在我的安卓应用程序中设置了匿名身份验证,但权限被拒绝的错误一直显示。顺便说一句,Anonymouse 身份验证在模拟器中工作正常。
我是这样实现的:
public void fireBaseAuthenticate(final Context context) {
mAuth = FirebaseAuth.getInstance();
mAuth.signInAnonymously()
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// debugger comes here, so Authentication is successful
} else {
// If sign in fails, display a message to the user.
}
}
});
}
public void load(final Context context) {
fireBaseAuthenticate(context);
database = FirebaseDatabase.getInstance();
databaseReference = database.getReference();
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot categorySnaps : dataSnapshot.getChildren()) {
RetailChain retailChain = new RetailChain();
retailChain.setName(categorySnaps.getKey());
for (DataSnapshot subMenuSnaps : categorySnaps.getChildren()) {
for (DataSnapshot itemSnaps : subMenuSnaps.getChildren()) {
for (DataSnapshot productSnaps : itemSnaps.getChildren()) {
Product product = productSnaps.getValue(Product.class);
productList.add(product);
}
}
}
retailChain.setProducts(productList);
retailChainList.add(retailChain);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w("database error: ", "onCancelled", databaseError.toException());
}
});
}
为 singleValueEvent
添加侦听器后,OnCancelled
被调用。
那么为什么拒绝许可呢?
编辑:
错误日志:
com.google.firebase.database.DatabaseException: Firebase Database error:
Permission denied
at com.google.firebase.database.DatabaseError.toException(Unknown Source)
at home.gio.calorieplanner.main.Main.onCancelled(Main.java:205)
at com.google.firebase.database.Query.onCancelled(Unknown Source)
at com.google.android.gms.internal.zzbpx.zza(Unknown Source)
at com.google.android.gms.internal.zzbqv.zzZT(Unknown Source)
at com.google.android.gms.internal.zzbra.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
当您设置规则 "auth != null"
时,这意味着用户在完成登录之前无法访问数据库。
而登录过程是一个asynchronous
,这意味着完整的监听器不会立即调用。
要解决您的问题,只需将读取数据库的代码移到完整的侦听器上即可。
public void load(final Context context) {
fireBaseAuthenticate(context);
}
public void fireBaseAuthenticate(final Context context) {
mAuth = FirebaseAuth.getInstance();
mAuth.signInAnonymously()
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// load the data
loadFromDB();
} else {
// If sign in fails, display a message to the user.
}
}
});
}
private void loadFromDB(){
database = FirebaseDatabase.getInstance();
databaseReference = database.getReference();
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot categorySnaps : dataSnapshot.getChildren()) {
RetailChain retailChain = new RetailChain();
retailChain.setName(categorySnaps.getKey());
for (DataSnapshot subMenuSnaps : categorySnaps.getChildren()) {
for (DataSnapshot itemSnaps : subMenuSnaps.getChildren()) {
for (DataSnapshot productSnaps : itemSnaps.getChildren()) {
Product product = productSnaps.getValue(Product.class);
productList.add(product);
}
}
}
retailChain.setProducts(productList);
retailChainList.add(retailChain);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w("database error: ", "onCancelled", databaseError.toException());
}
});
}