2016-10-11 11 views
0

TLDR:DBアクセスルールを設定して、指定したエンドポイントから権限を持つすべてのアイテムを読み取るにはどうすればよいですか?Firebase - エンドポイントからの読み取りアクセス権を持つアイテムを取得する

私はFirebaseデータベース内のデータの同様のセットがあります。私はまた、アプリケーションのユーザーのリストを持っている

"employees" : [ { 
    "first_name" : "Constance", 
    "last_name" : "Smith", 
    "createdBy: "vdBoGzI2i9f12er6ZcPjG9AiTip2" 
    }, { 
    "first_name" : "Agatha", 
    "last_name" : "Carlton", 
    "createdBy: "Tpg1mFR99meDV2QGT44pU6y7s1T2" 
    }, 
    ... 
} 

を:

"users" : { 
    "Tpg1mFR99meDV2QGT44pU6y7s1T2" : { 
     "name" : "Alex Lund", 
     "isAdmin": true 
    }, 
    "vdBoGzI2i9f12er6ZcPjG9AiTip2" : { 
     "name" : "David Peterson", 
     "isAdmin": false 
    }, 
    ... 
    }, 

基本的なユーザーは、ちょうど彼らが作成した従業員へのアクセス権を持っています;管理者はすべてを読むことができます。このルールでは

{ 
    "rules": { 
    ".write": "auth != null", 
    "employees": { 
     "$employee": { 
     ".read": "root.child('users').child(auth.uid).child('isAdmin').val() === true || data.child('createdBy').val() === auth.uid" 
     } 
    }, 
} 

、管理者がref.child('/employees/0')を読み取ることができますが、ref.child('employees')にアクセスすることはできません。

私はどのように私が読むことができる従業員を得ることができますか?クエリを実行するのは唯一のソリューションですか?

答えて

0

今のルールでは、/usersのクエリは機能しません。 /employeesの読み取り権がないため、その場所のリスナーはただちに拒否されます。通常のユーザーは、彼らが唯一のアクセス子供に作成できる一方で、管理者は(したがって、クエリ)/users読むことができますこれらのルールでは

{ 
    "rules": { 
    ".write": "auth != null", 
    "employees": { 
     ".read": "root.child('users').child(auth.uid).child('isAdmin').val() === true" 
     "$employee": { 
     ".read": "data.child('createdBy').val() === auth.uid" 
     } 
    }, 
} 

はおそらく、ルールは次のようになりたいです。

これは、Firebaseデータベースのセキュリティルールでは一般的な落とし穴であり、通常「ルールはフィルタではありません」と呼ばれます。関連するsection in the documentationと、original Q&A on itと、questions in this listのいずれかを参照してください。

+0

フランクの偉大な答え、および関連するリファレンスリンク – davidey

関連する問題