0

我有一個火力地堡數據庫以下規則:火力地堡數據庫規則和PERMISSION_DENIED錯誤

{ 
    "rules": { 
    "messages": { 
     "$message": { 
     ".read": "true", 
     ".write": "newData.child('uid').val() === auth.uid" 
     } 
    } 
    } 
} 

的數據結構是這樣的:

enter image description here

我可以寫入沒有問題,但是當我嘗試閱讀時,出現以下錯誤:

Error: permission_denied at /messages: Client doesn't have permission to access the desired data. 

我已閱讀firebase文檔,並且我的結構看起來與給出的示例相同。請,有人能告訴我這有什麼問題嗎?

請注意:在「消息」下移動讀取規則確實解決了問題,但不是我想要的解決方案,因爲我想根據消息數據(類似於寫入規則)編寫規則基本規則工作。我想用這樣一個規則來結束:

{ 
    "rules": { 
    "messages": { 
     "$message": { 
     ".read": "data.child('uid').val() === auth.uid", 
     ".write": "newData.child('uid').val() === auth.uid" 
     } 
    } 
    } 
} 

回答

1

你在/messages/$message定義不影響查詢/messages製成,因爲你還沒有添加任何讀取權限/messages,你得到許可被拒絕的規則。

如果您想要檢索單個用戶發出的郵件,請考慮重構您的數據以將用戶的郵件嵌套在其用戶名下,例如,

{ 
    "rules": { 
    "user-messages": { 
     "$uid": { 
     ".read": "auth.uid === $uid", 
     "$mid": { 
      ".write": "newData.child('uid').val() === $uid" 
     } 
     } 
    } 
    } 
} 

使用此結構,您可以檢索用戶擁有的所有消息。如果您想要檢索所有郵件,則還需要將郵件寫入/messages。在這裏您可以存儲消息數據,並且在/user-messages/$uid中,可以存儲用戶發佈的每條消息的密鑰。您可以使用多位置更新同時執行兩個寫操作)。

{ 
    "messages": { 
    "a": { "uid": "0", ... }, 
    "b": { "uid": "0", ... } 
    } 
    "user-messages": { 
    "0": { 
     "a": true, 
     "b": true 
    } 
    }, 
    "users": { 
    "0": { ... } 
    } 
} 

獲取用戶消息的密鑰user-messages/$uid,然後獲取每條消息。

+0

嗯..我從這樣的結構開始,但我的問題是,我有兩個用例;一個用戶只能看到他們自己的消息,另一個用戶在管理員看到所有消息。管理員查詢需要能夠通過諸如消息打開或關閉等屬性進行過濾。當我試圖用更嵌套的結構來做到這一點時,我發現編寫管理查詢是不可能的(太多的嵌套)。聽起來像我回到了繪圖板... :-( –

+0

所以只有管理員可以看到所有的消息,所以用戶只能看到他們的消息? – Callam

+0

是的,這是正確的。我有一個令牌,我可以識別這個問題正在構造數據,所以我可以查詢它並且用戶可以閱讀他們自己的消息。 –