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

Posted

技术标签:

【中文标题】Android Firebase 数据库错误:权限被拒绝【英文标题】:Android Firebase Database Error: Permission denied 【发布时间】:2017-04-17 23:18:42 【问题描述】:

我正在开发一个需要用户电子邮件和密码验证的 android 项目。详细信息存储在 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) 

        
    );

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

【问题讨论】:

除了错误消息已经说明的内容外,我们无话可说:您正在尝试读取您无权访问的数据。为了让我们更有帮助,请分享将触发此错误的 minimal JSON 和安全规则。 【参考方案1】:

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

转到 firebase 控制台并在您的数据库上启用读写操作。

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


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

【讨论】:

非常感谢。问题不在规则部分,但很高兴您做出回应。谢谢大家。 您的安全规则被定义为公开的,因此任何人都可以窃取、修改或删除您数据库中的数据。使用该规则我收到上述警告。【参考方案2】:

如果不需要,请不要将您的应用公开。 如谷歌文档所述,您可以在您的 firebase > database > rules 上执行这些规则

// 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"
      
    

公开应用程序让任何人都可以编写和阅读您的应用程序...我认为任何应用程序都不应该那样使用它。

【讨论】:

【参考方案3】:

转到数据库控制台上的“规则”选项卡。如果您没有明确授予用户 .read 访问权限,则权限将被拒绝。

Firebase 文档中的此链接非常好:

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

该页面上的这两个注释特别有趣:

注意:默认情况下不允许访问。如果在路径或路径上方未指定 .write 或 .read 规则,则访问将被拒绝。

注意:较浅的安全规则会覆盖较深路径的规则。子规则只能授予父节点已经声明的额外权限。他们不能撤销读取或写入权限。

查看权限被拒绝的节点并使用“规则”选项卡上的模拟器来测试不同用户安全上下文(未验证、已验证等)的规则

【讨论】:

【参考方案4】:

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

    转到 firebase -> 数据库 -> 规则


  "rules": 

    ".read": true,
    ".write": true
  


【讨论】:

由于非最佳可读性、缺乏解释、需要适当的格式以及链接文本的混乱使用,这降低了它的帮助。 我为你解决了一些问题。请edit 添加解释,并可能添加“2”。或删除“1.”。 @Yunnosch thnx 寻求帮助。【参考方案5】:

请尝试更改您的 Firebase 规则,如下所示我之前遇到过这个问题。 我的问题出在数据库规则中:


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

【讨论】:

如果我使用这些规则,任何人都可以进行更改。【参考方案6】:

问题是firebase数据库有两个同名项目,甚至没有启用项目的规则之一 所以在所有项目上查看一次

【讨论】:

【参考方案7】:

转到 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"
  
 

【讨论】:

【参考方案8】:

大多数答案只是建议让任何人都可以访问数据库来阅读和编辑。对于粗略的测试,这可能是可以接受的,但对于任何严重的测试肯定是不行的。

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"
      
    
  

【讨论】:

以上是关于Android Firebase 数据库错误:权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Firebase实时数据库:DatabaseError权限被拒绝

批量用户订阅 Firebase 中的主题时出现权限被拒绝错误

当一批用户订阅Firebase中的主题时,权限被拒绝错误

Firebase 文本文件下载错误

Firebase 权限被拒绝错误

Firebase Android:发生内部错误。 [ OPERATION_NOT_ALLOWED ]