2016-03-16 30 views
0

我使用的Objective-C API的火力地堡來獲取數據和我能夠這樣做,當我的安全規則(通過在線火力地堡的儀表盤設置)不利用任何通配符的路徑,如:安全規則無法使用的Firebase通配符路徑?

{ 
    "rules": { 
    "user" : { 
     ".read" : true, 
     ".write" : true 
    }, 
    "users" : { 
     ".read" : true, 
     ".write" : false 
    } 
    } 
} 

但當我嘗試制定什麼應該是使用通配符的路徑相同的安全規則和獲取的對象,完成處理器根本不會執行,如:

{ 
    "rules": { 
    "user" : { 
     ".read" : true, 
     ".write" : true 
    }, 
    "users" : { 
     "$userId" : { 
     ".read" : true, 
     ".write" : false 
     } 
    } 
    } 
} 

我用火力地堡文檔下面的網址,不能弄清楚什麼我做錯了:https://www.firebase.com/docs/security/quickstart.html

我不認爲問題是Objective-C特定的,但只是爲了徹底我使用方法-[FQuery observeSingleEventOfType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) { }]來獲取我的數據。


更新:這裏是po query對我使用調試的特別FQuery輸出:

(/users { 
    ep = 0; 
    i = hidden; 
    sp = 0; 
}) 

更新2:這是我的數據結構,在相關情況:

{ 
    "user" : { 
    "HhMeloQDY4" : { 
     "info" : { 
     "name" : "Anita Borg" 
     } 
    }, 
    "QxnjCNOj3H" : { 
     "info" : { 
     "name" : "Charles Babbage" 
     } 
    }, 
    "zeNalC4ktf" : { 
     "info" : { 
     "name" : "Beyoncé" 
     } 
    } 
    }, 
    "users" : { 
    "HhMeloQDY4" : { 
     "hidden" : false 
    }, 
    "QxnjCNOj3H" : { 
     "hidden" : false 
    }, 
    "zeNalC4ktf" : { 
     "hidden" : true 
    } 
    } 
} 

更新3:^h ERE的我的我如何創建我FQuery對象Objective-C代碼:

Firebase *firebase = [[Firebase alloc] initWithUrl:@"https://<my-app-name>.firebaseio.com"]; 
[[firebase childByAppendingPath:@".info/connected"] observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) { 
    BOOL isConnected = [snapshot.value boolValue]; 
    // broadcast whether app is connected to Firebase 
}]; 
Firebase *directory = [firebase childByAppendingPath:@"users"]; 
FQuery *query = [directory queryOrderedByChild:@"hidden"]; 
query = [query queryEqualToValue:value]; 
[query observeSingleEventOfType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) { 
    // data successfully retrieved from Firebase 
}]; 
+0

'FQuery'指向什麼? –

+0

FQuery是Firebase Objective-C庫中的一個查詢類:https://www.firebase.com/docs/ios-api/Classes/FQuery.html –

+0

我知道它是什麼類。我想知道它指向什麼,因爲這很可能說明讀取操作失敗的原因。 –

回答

2

您已經閱讀添加在路徑/users/specific_user_id/訪問,但你嘗試在路徑/users/,這也使不讀訪問閱讀。

您需要提供對您嘗試閱讀的路徑的訪問權限,而不僅僅是其子集的子集。見security rules are not filters

編輯:只是增加了一些ObjC代碼澄清

與查詢呈現

Firebase *directory = [self.myRootRef childByAppendingPath:@"users"]; 

你直接查詢用戶節點內的節點。但是,如果您查看結構,則用戶節點內部無法查詢,因爲在/users下沒有規則,因此我已對其進行評論。

"users" : { 
    //OH NOES! There are no rules here! 
    "$userId" : { 
    ".read" : true, 
    ".write" : false 
    } 

你的規則是$用戶id,它代表並適用於父只

"$userId" : { 
    //these rules *only* apply inside each userId. 
    ".read" : true, 
    ".write" : false 
} 
與結構

所以內,這條查詢工作,它會在查詢內部用戶的內容/只HhMeloQDY4 。

Firebase *directory = [self.myRootRef childByAppendingPath:@"users/HhMeloQDY4"]; 

所以最終的結果是,你需要直接分配/用戶節點,將允許您查詢的內容在它的子節點下的規則。

"users" : { 
    ".read" : true, 
    ".write" : false 
    "$userId" : { 
    } 

這將允許您閱讀以下的用戶節點的每個節點($帳戶及它的孩子),但不給他們寫信。

+0

我明白安全規則不是過濾器,但是我試圖從'/ users //'而不是'/ users /'讀取的位置感到困惑,我認爲在我的兩個安全規則中,我明確允許讀取通過'「.read」訪問:true'。你能詳細說明嗎? –

+0

我已經爲包含我的數據結構的問題添加了一個更新,以便澄清任何事情。我仍然困惑於我的問題是如何重複的。 –

+0

@ KenM.Haggerty您可以使用實際的ObjC代碼更新您的問題(請簡要說明),您正在使用它來查詢/觀察有問題的節點。加藤的答案是正確的,但看到你的代碼(可能是畸形的)可能會幫助我們讓你朝着更好的方向前進,並幫助你理順規則。 – Jay