Firebase(NOSQL)でどのようなデータ構造にすべきか悩んでおります。
用件
- データベースにx件のニュースが投稿される
※今回は投稿(書き込み)部分のパーミッションについては無視してください。
- 本システムを利用できるユーザーはx人存在し、管理者が承認したユーザのみがニュースを閲覧できる。
- 承認されたユーザは全てのニュースを閲覧できるわけではなく、許可されたニュースのみ閲覧できる。
サンプル
以下 -useridxxxx
は auth.uid
と同じです。
- 投稿されたニュースは2件
- ユーザ1(-userid0001)は ニュース2件とも閲覧できる
- ユーザ2(-userid0002)は ニュース1(-newsid0001)のみ閲覧できる
- ユーザ3(-userid0003)は どのニュースも閲覧できない
ルール
{ "rules": { ".read": false, ".write": false, "news" : { "$news_id" : { ".read" : "root.child('users/'+ auth.uid +'/news/'+$news_id).exists()" } } } }
データ構造
{ news : { -newsid0001 : { title : "タイトル0001", message : "メッセージ0001", read_users : { // 各ニュースごとに閲覧できるユーザのUIDを以下へ追加 -userid0001 : true, } }, -newsid0002 : { title : "タイトル0002", message : "メッセージ0002", read_users : { // 各ニュースごとに閲覧できるユーザのUIDを以下へ追加 -userid0001 : true, -userid0002 : true, } }, } users : { // 以下 -useridxxxxがユーザIDとなります。 -userid0001 : { news : { -newsid0001 : true, -newsid0002 : true, } }, -userid0002 : { news : { -newsid0001 : true, } }, -userid0003 : { }, }, }
一応上記の通りにすればセキュリティ面ではクリアできますが、データの取得が /news
で取得できないため、 /news/$news_id
でループして取得するようになってしまい、クライアント側のコードも増え、APIリクエストも増えてしまうのが気がかりです。
より良い設計をご存知の方アドバイスをお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/07 05:06