2017-08-29 85 views
1

我有我的結構如下數據:火力地堡閱讀基礎上的關鍵數據規則

writings: { 
    'xxx-key-xxx': { 
     'user-id': 'xxxxx', 
     'title': 'title', 
     'content': 'content' 
    } 
} 

而且我想允許讀取訪問用戶只有他的證件:

{ 
    "rules": { 
    "writings": { 
     ".read": "auth !== null && (root.child('writings').child('user-id').val() === auth.uid)", 
     } 
    } 
} 

但這不起作用。我懷疑我沒有正確安裝鑰匙user-id。任何想法?

+0

什麼不行?你能否顯示你不想工作的代碼?反之亦然:無法閱讀的代碼,您想要的代碼? –

+0

我在Firebase控制檯中模擬並且被拒絕。我將存儲有'uid'的數據設置爲模擬器中使用的UID,但無法讀取。 –

+0

模擬的路徑是'/ writings /'。我想獲取用戶擁有的所有文字。 –

回答

2

您正在比較auth.uid與路徑/writings/user-id的值,該路徑缺少密鑰xxx-key-xxx,所以這將始終爲假,因爲此路徑上的數據不存在。您可以更改您的規則以獲得孩子的密碼,但是,這會限制您的.read許可權來閱讀個人writings兒童,例如

{ 
    "writings": { 
    "$wid": { 
     ".read": "auth !== null && root.child('writings/$wid/user-id').val() === auth.uid" 

或等價

 ".read": "auth !== null && data.child('user-id').val() === auth.uid" 
    } 
    } 
} 

利用這些規則,你會看到Permission Denied試圖讀取/writings時 - 你必須逐個讀取文件,所以你必須知道每個文檔的關鍵。現在我們知道我們需要的是每個文檔的關鍵字,我們需要找到一種檢索它們的方法。

表示這樣的關係的一種常見方式是通過扇出數據。我們有用戶的uid,我們需要他們擁有的文檔的密鑰。如果您要維護另一個存儲每個用戶文檔的密鑰的根節點,那麼您可以引用該位置來檢索用戶的文檔。

{ 
    "user-writings": { 
    "$uid": { 
     ".read": "auth.uid === $uid", 
     "$wid": { 
     ".write": "auth.uid === $uid" 
     } 
    } 
    }, 
    "users": { 
    ... 
    }, 
    "writings": { 
    "$wid": { 
     ".read": "auth.uid === data.child('user-id').val()", 
     ".write": "auth.uid === newData.child('user-id').val()" 
    } 
    } 
} 

這些規則確保用戶只能憑藉只具有user-writings/$uid訪問自己的文檔的按鍵查看自己的文件。當用戶創建書寫時,他們還需要寫入user-writings/$uid/$wid將值設置爲true

現在要檢索屬於用戶的文檔,您需要用用戶的uid查詢位置user-writings/$uid以檢索密鑰,然後必須獲取用戶擁有的每個writings/$wid的數據。它可能適合您將writings完全丟棄並將每個用戶的文檔存儲在數據庫中相應的位置(user-writings/$uid)。