Firebase 权限被拒绝

Posted

技术标签:

【中文标题】Firebase 权限被拒绝【英文标题】:Firebase permission-denied 【发布时间】:2018-06-07 14:56:29 【问题描述】:

我是 firebase 的新手。

如何通过以下规则?

service cloud.firestore 
  match /databases/database/documents 
    match /document=** 
      allow read, write: if false;
    
  

我已尝试将规则更改为以下,


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

但是有一个错误

mismatched input '' expecting 'function', 'service', 'syntax'

下面是数据库结构。

目前,这是我的代码(不断返回 Permission-denied):

    // [START initialize_database_ref]
    mDatabase = FirebaseDatabase.getInstance().reference
    // [END initialize_database_ref]

    val result = HashMap<String, Any> ()
    result.put("timestamp", getCurrentTime())
    result.put("user_id", USER_ID)
    result.put("x_position", -1)
    result.put("y_position", -1)

    mDatabase!!.ref.child("raw data").child("Z9QD79lDzP7MpD6feWeJ").setValue(result).addOnFailureListener(object : OnFailureListener 
        override fun onFailure(@NonNull e: Exception) 
            Log.d("firebase", e.localizedMessage)
        
    )

任何帮助将不胜感激!谢谢:)

【问题讨论】:

【参考方案1】:

我能够通过从 Cloud Firestore 切换到实时数据库,然后更改规则来解决问题。 (在我改变这个之后,没有更多的错误显示!)

【讨论】:

【参考方案2】:

对于其他在这个问题上苦苦挣扎的人,正确的解决方案是在

中更改false
service cloud.firestore  
    match /databases/database/documents 
        match /document=**  
            allow read, write: if false; 
         
    

测试时发送至true在项目上线时不要忘记添加额外的安全性!

【讨论】:

我也试过了,但仍然被拒绝。即使我用另一种方式解决了这个问题,我也不知道为什么:(【参考方案3】:

如果您使用“实时数据库”或“Cloud Firestore”,您应该检查您的 Angular NgModule 和组件。使用“angularfire2”查看差异:

实时数据库

@NgModule(
...
imports: [
    AngularFireDatabaseModule,
    ...
],
providers: [
AngularFireDatabase,
...
]
)


@Component(...)
export class FirestoreComponent
   constructor(private realtimeDb:AngularFireDatabase, ...) 
       this.locations = realtimeDb.list('locations').valueChanges();
     
...

云防火墙

@NgModule(
    ...
    imports: [
       AngularFirestoreModule,
       ...
    ]
)

@Component(...)
export class FirestoreComponent
   constructor(private firestore:AngularFirestore, ...) 
       this.locations = firestore.collection('locations').valueChanges();
     
...

【讨论】:

【参考方案4】:

因为您的方法查询的是 Firebase 而不是 Cloud Firestore 所以你应该使用这个方法:

FirebaseFirestore db = FirebaseFirestore.getInstance();
    db.collection("YourCollectionName").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() 
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) 
            if (task.isSuccessful()) 
                for (QueryDocumentSnapshot document : task.getResult()) 
                    Log.d(TAG, document.getId() + " => " + document.getData());
                
             else 
                Log.w(TAG, "Error getting documents.", task.getException());
            
        
    );

不要忘记这一点:

implementation 'com.google.firebase:firebase-firestore:17.0.1'

【讨论】:

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

Firebase权限被拒绝Swift 3

Firebase 注销显示权限被拒绝错误。

无法上传到 Firebase 存储/权限被拒绝

Firebase 规则 - 权限被拒绝

Android Studio和Firebase中的权限被拒绝错误[重复]

Firebase存储错误中的权限被拒绝[重复]