安卓Firebase数据库错误:权限被拒绝

31

我正在开发一个安卓项目,需要用户输入电子邮件和密码以进行身份验证,详细信息存储在Firebase数据库中。问题出现在我尝试使用相同的电子邮件和密码重新登录时。我的logcat中出现了错误消息:

W/SyncTree: Listen at / failed: DatabaseError: Permission denied

请查看下面的代码:

public class LoginUser extends AppCompatActivity {

private RelativeLayout relativeLayout;

private EditText et_email, et_password;
private Button loginBtn;

private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener authStateListener;
private DatabaseReference databaseReference;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login_user);

    mAuth = FirebaseAuth.getInstance();
    databaseReference = FirebaseDatabase.getInstance().getReference();
    databaseReference.keepSynced(true);

    relativeLayout = (RelativeLayout) findViewById(R.id.activity_login_user);

    et_email = (EditText) findViewById(R.id.emailField);
    et_password = (EditText) findViewById(R.id.pwdField);
    loginBtn = (Button) findViewById(R.id.loginBtn);

    loginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            initLogin();
        }
    });

    authStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            if (firebaseAuth.getCurrentUser() != null){
                initLogin();
            }
            else {
                startActivity(new Intent(LoginUser.this,RegisterFireBase.class));
            }
        }
    };

}

@Override
protected void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(authStateListener);
}

@Override
protected void onStop() {
    super.onStop();
    if (mAuth != null){
        mAuth.removeAuthStateListener(authStateListener);
    }
}

private void initLogin() {

    String email = et_email.getText().toString().trim();
    String pass = et_password.getText().toString().trim();

    if (!TextUtils.isEmpty(email) && !TextUtils.isEmpty(pass)){
        mAuth.signInWithEmailAndPassword(email,pass).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {

                checkForUser();

            }
        });
    }
    else {
        Toast.makeText(this, "Some fields are empty", Toast.LENGTH_SHORT).show();
    }

}

private void checkForUser() {

    final String userId = mAuth.getCurrentUser().getUid();
    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.hasChild(userId)){

                Intent loginIntent =  new Intent(LoginUser.this, FireProfile.class);
                loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(loginIntent);

                Snackbar.make(relativeLayout,"Log In Successful",Snackbar.LENGTH_LONG).show();

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

}

这可能是什么原因造成的?


1
除了错误信息已经说的,我们没有太多可以说的:您正在尝试读取您无权访问的数据。为了让我们更有帮助性,请分享会触发此错误的最小JSON和安全规则。 - Frank van Puffelen
8个回答

44

可能的原因是:您没有对数据库进行读写访问权限。

为了启用读写访问权限:

进入Firebase控制台,在您的数据库上启用读写操作。

Firebase控制台->数据库(develop)->规则

{
  "rules": {
    ".read": "true",
    ".write": "true"
  }
}

非常感谢。问题不在规则部分,但很高兴你回复了。谢谢大家。 - Nzadibe
2
您的安全规则被定义为公共规则,因此任何人都可以窃取、修改或删除您数据库中的数据。我在使用这些规则时收到了上述警告。 - Shubham Garg

18
不必要的情况下不要将您的应用程序发布为公共应用程序。如Google文档所述,您可以在Firebase>数据库>规则中执行这些规则。
// These rules grant access to a node matching the authenticated
// user's ID from the Firebase auth token
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

或者只允许经过身份验证的用户

// These rules require authentication
    {
      "rules": {
        ".read": "auth != null",
        ".write": "auth != null"
      }
    }

让一个应用程序公开,就意味着任何人都可以编写和阅读你的应用程序...... 我认为没有任何应用程序应该像这样使用它。


10

在你的数据库控制台中进入“规则”选项卡。如果你没有明确授予用户读取权限,那么将被拒绝访问。

这个链接在 Firebase 文档中非常好:

https://firebase.google.com/docs/database/security/securing-data

该页面上的以下两条注意事项特别重要:

注意:默认情况下,禁止访问。如果在路径上或以上未指定 .write 或 .read 规则,则将拒绝访问。

注意:较浅的安全规则会覆盖更深层次路径上的规则。子规则只能赋予已声明的父节点额外的权限。它们无法撤销读写权限。

查看未授权访问的节点,并使用 Rules 选项卡上的模拟器为不同的用户安全上下文(未经身份验证、已经身份验证等)测试你的规则。


10

对Firebase数据库进行一些更改。

  1. 前往Firebase ->数据库 ->规则

screenshot

{
  "rules": 
{
    ".read": true,
    ".write": true
  }

}

3
由于可读性不佳、缺乏解释、需要适当的格式以及混淆的链接文本,这一点的实用性受到了降低。 - Yunnosch
1
我为你修复了一些问题。请[编辑]添加解释,也许添加一个“2。”或删除“1.”。 - Yunnosch
@Yunnosch 谢谢你的帮助。 - HandyPawan

4

大多数答案只是建议将数据库访问权限开放给任何人以读取和编辑。这可能适用于粗略测试,但肯定不适用于任何严肃的事情。

Google Firebase允许配置允许和拒绝访问。在此处阅读官方文档: https://firebase.google.com/docs/rules/basics#realtime-database
(确保选择正确类型的Firebase数据库)

对于需要身份验证的任何内容,您都需要设置Firebase身份验证:https://firebase.google.com/docs/auth

以下是一些基本示例:

无访问权限(默认值)

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

需要验证用户身份

{
  "rules": {
    ".read": "auth.uid != null",
    ".write": "auth.uid != null"
  }
}

只读共有,仅拥有者可写

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid != null" for only authenticated users
        ".write": "auth.uid == $uid"
      }
    }
  }
}

3

请尝试更改以下firebase规则,我之前遇到过这个问题。 我的问题在数据库规则中:

{
  "rules": {
    ".read": "true",
    ".write": "true"
  }
}


如果我使用这些规则,任何人都可以进行更改。 - Vivek Pratap Singh

1
问题在于Firebase数据库有两个同名的项目,其中一个项目的规则甚至没有启用。因此,请检查所有项目。

1
前往Firebase控制台,启用数据库的读写操作。
Firebase控制台 -> 数据库(开发) -> 规则
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

如果你正在使用旧版本,请添加以下规则:
{
  "rules": {
    ".read": "true",
    ".write": "true"
  }
} 

Screenshot


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接