2016-08-23 9 views
0

2つのオブジェクトに少なくとも1つの共通の子があるかどうかを確認しようとしています。次の例では、人々がorg.money.valueを読むことができる場合、制御できるようにしたいと考えています。Firebaseリアルタイムデータベース - ルール - 2つのオブジェクトに共通の子が少なくとも1つありますか?

読み込み権は、org.keysの子とユーザーの{auth.uid} .keysを比較することによって決まります。共通鍵がある場合は、読み取りが許可されます。

データベースJSON:

{ 
    "org" : { 
     "keys" : { 
      "red" : { 
       "value" : "..." 
      }, 
      "blue" : { 
       "value" : "..." 
      } 
     }, 
     "money" : { 
      "value" : "..." 
     } 
    }, 
    "users" : { 
     "John" : { // in reality John == auth.uid of a user 
      "keys" : { 
       "red" : { 
        "value" : "..." 
       } 
      } 
     }, 
     "Alice" : { // in reality Alice == auth.uid of a user 
      "keys" : { 
       "green" : { 
        "value" : "..." 
       } 
      } 
     } 
    } 
} 

ルール:

"rules:"{ 
    "org" : { 
     "money" : { 
      // can read if "org.keys" and "users.auth.uid.keys" 
      // have at least one common child name. 
      // With the above data reading would be allowed for John, 
      // but not for Alice. 
      ".read" : what to write here? 
     } 
    } 
} 

それがこの作品を作ることは可能ですか?

ちなみに、組織はユーザーのauth.uidを認識していません。

答えて

0

現在のデータベース構造でJSONルールでこの決定を行うことはできません。私はあなたの構造を変更して、この種の読み取り判定を可能にすることをお勧めします。私が思いついた潜在的な解決策は、クライアント側でより多くのフィルタリングが必要になるでしょう:

新しいユーザーキーを作成するとき、orgキーをループして既にそこに含まれているかどうかを確認します。その場合は、BOOLをユーザーオブジェクトに追加します。おそらくは "canReadMoney"をtrueに設定します。

"rules:"{ 
    "org" : { 
    "money" : { 
     ".read" : "root.child('users').child(auth.uid).child('canReadMoney').val==true" 
    } 
    } 
} 
0

別の解決策は、この

usersShareOrg 
    { 
     "John": { "Org" : true } 
     "Alice": {"Org": false} 
    } 

のように、データベース内のエンドポイントを保存することができ、これらの値が計算され、あなたが新しい追加するたびに格納されます:次に、お金のためにあなたのルールは次のようになりますuserまたはorg.keysエンティティです。

関連する問題