2016-10-02 1 views
1

ユーザーがいくつかのプライベートデータを/private/$userIdに保存しているとしましょう。他のユーザーと共有できるかどうかは、決定はの/privacySettings/$userId/shareDataに保存する必要があります。ユーザーがその値をtrueに設定すると、他のユーザーはプライベートデータを読み取ることができます。Firebase:ユーザーがデータのプライバシーを決定する方法を教えてください。

私はpersistanceが有効になっており、サーバーのルールでこれを解決しようとしている:これは正常に動作しますが、

"private": { 
".read": false, 
".write": false, 
    "$userId": { 
    ".read": "auth != null && root.child('privacySettings/' + $userId + '/shareData').val() === true", 
    ".write": "auth != null && auth.uid == $userId" 
    } 
} 

private/$userId.Valueで観察されたときに、残念ながらshareDataの変化は、イベントは発生しません。したがって、他のユーザーがプライバシーの変更前にこのパスを観察した場合でも、永続性データストアにキャッシュされたデータは引き続き表示されます。 shareDatafalseの場合、すべてのデータを他人に隠す必要があります。

これを行う方法?

EDIT: ただ、データが読み込まれた後shareDatafalseに設定されている場合、観察者は常にキャッシュされたデータに関係なく返されることが分かりました。これは、アプリの再起動時にも発生します。

EDIT 2: それについての詳細を考えた後、私は、コールバックが「Permission denied」エラーが戻った場合は、この問題は簡単に解決することができるという結論に達しました。

答えて

0

私は問題のための合理的な回避策/解決策を見つけたと思います。そうのよう/private/$userIdshareDataを埋め込む

- private 
    - $userId 
    - shareData // Bool 
    - data // contains private data 

dataがキャッシュされている場合でも、1は簡単に応じてそれを隠すことができますshareDataの値は、別のノードを観察しません。

サーバーのルール:

"private": { 
".read": false, 
".write": false, 
    "$userId": { 
     ".read": "auth != null", //(*) 
     ".write": false, 
    "shareData": { 
     ".write": "auth != null && auth.uid == $userId", 
     ".read": "auth != null", 
    }, 
    "data": { 
     ".read": "auth != null && root.child('private/' + $userId + '/shareData').val() === true", 
     ".write": "auth != null && auth.uid == $userId", 
    } 
    } 
} 

EDIT:(*)でマークされた行は、子ルールよりも優先されますよう はそう... "data.child('shareData').val() === true"を使用すると、前と同じ効果が発生します:キャッシュされたデータがある場合、それが表示されます。

+0

上記のルールの一部は無効です。編集で指摘したように、ルールはカスケードされます。親にパーミッションを付与した場合、子でそれを取り消すことはできません。 – cartant

関連する問題