Доступ к смежным данным в базе данных - PullRequest
0 голосов
/ 04 июня 2018

Давайте представим простой сценарий: простая почтовая система в firebase в дереве, подобная этой:

{
 "users":{
    "user-0001":{
       "mailbox":{
        "user-0002":{
           "DSdljkdkd333klll":{
              "message":"Hi ! I am user-0002 and I sent to user-0001 a message"
           },
           "JjkJHHH8888Gggg2":{
              "message":"Hi ! It's Me, user-0002 again !"
           }
        }
     },
     "secretStuff":"Something Private - nobody can write anything here",
     "myContacts":"This is my contact list. Obviously just me can access"
    },
    "user-0002":{
       "mailbox":{
         "user-0056":{
           "DSdljkdkd333klll":{
              "message":"Party tonight ! Don't forget !"
           }
        },
        "user-0282":{
           "3893NJJj33333eddf":{
              "message":"How are you ?"
           }
        }
     },
     "secretStuff":"Something Private - nobody can write anything here",
     "myContacts":"This is my contact list. Obviously just me can access"
  }
 }
}

Я как пользователь-0002 , я могу писать в своем собственном дереве.

Хорошо, но я должен быть в состоянии написать для пользователя - * / mailbox / user-0002, потому что я могу отправить сообщение любому пользователю, которого я хочу.И конечно: у меня нет доступа к любому другому ключу.

Итак, как заархивировать это: правило, в котором я могу писать в своем дереве и в соседнем дереве, как в примере выше?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

После исследования и тестирования я пришел к выводу, что это должно работать ...

{
 "rules":{
  "users":{
     "$uid":{
        ".write":"$uid === auth.uid",
        ".read":"$uid === auth.uid",
        "mailbox":{
           "$uid":{
              ".write":" $uid === auth.uid"
           }
        }
     }
  }
 }
}

Это означает:

Если я пользователь-0001, я могу читать / писать что угоднов / users / user-0001, однако я просто могу написать в другом месте, если путь будет / users / * / mailbox / user-0001

0 голосов
/ 04 июня 2018

Вы должны хранить публичные данные и личные данные в отдельных списках верхнего уровня.Итак:

mailboxes
  user-0001
    user-0002:{
      "DSdljkdkd333klll":{
       "message":"Hi ! I am user-0002 and I sent to user-0001 a message"
      },
      "JjkJHHH8888Gggg2":{
       "message":"Hi ! It's Me, user-0002 again !"
      }
    }
  user-0002
    user-0056:{
      "DSdljkdkd333klll":{
       "message":"Party tonight ! Don't forget !"
      }
    },
    user-0282:{
      "3893NJJj33333eddf":{
       "message":"How are you ?"
      }
    }
contacts
  user-0001: "This is my contact list. Obviously just me can access"
  user-0002: "This is my contact list. Obviously just me can access"
secrets
  user-0001: "Something Private - nobody can write anything here"
  user-0002: "Something Private - nobody can write anything here"

Теперь вы можете защищать доступ на основе типа информации и загружать определенные типы информации.

Если вам нужна вся информация для конкретного пользователя, вам нужно будет прочитать все три места.Но, учитывая, что вы обычно делаете это для конкретного пользователя, эти операции чтения не являются проблемой масштабируемости.Даже если вам нужна вся информация для нескольких пользователей, она обычно довольно быстрая, поскольку Firebase передает запросы по одному соединению .

Также см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...