Как предоставить доступ на чтение-чтение / запись к определенным UID из Firebase Auth и Database - PullRequest
0 голосов
/ 13 марта 2019

Я изо всех сил пытался понять понимание недавних исследований того, как реализовать различные уровни доступа для определенных пользователей в моей системе. Я хочу иметь возможность предоставить одному пользователю доступ на чтение, а другому - чтение / запись со ссылкой на его uid. Какая работа требуется для реализации этого?

Нужно ли реструктурировать мою БД и как структурированы мои правила JSON?

enter image description here

enter image description here

ОБНОВЛЕНИЕ - Реализованы новые правила и структура БД

Текущая ссылка на БД для магазина 01 -

database = FirebaseDatabase.getInstance().getReference("stores").child("Store 01").child("Task List"); //Find the Task List table in database and making a reference.

Обновлена ​​структура правил в следующем

{
"rules": {

"stores": {
        ".read": "auth != null && (root.child('readUsers').hasChild(auth.uid) || root.child('readWriteUsers').hasChild(auth.uid))",
        ".write": "auth != null && root.child('readWriteUsers').hasChild(auth.uid)"
  },

"readUsers": {
        ".read": "auth != null && root.child('readUsers').hasChild(auth.uid)",
        ".write": false   
},


"readWriteUsers": {
        ".read": "auth != null && root.child('readWriteUsers').hasChild(auth.uid)",
        ".write": false   
}

} }

Обновлена ​​структура БД до следующей

enter image description here

1 Ответ

1 голос
/ 13 марта 2019

Одним из решений является наличие определенных узлов базы данных, перечисляющих ваших пользователей, следующим образом:

{
  "rules": {

    "Store01": {
            ".read": "auth != null && (root.child('readUsers').hasChild(auth.uid) || root.child('readWriteUsers').hasChild(auth.uid))",
            ".write": "auth != null && root.child('readWriteUsers').hasChild(auth.uid)"
      },

    "readUsers": {
            ".read": "auth != null && root.child('readUsers').hasChild(auth.uid)",
            ".write": false   
    },


    "readWriteUsers": {
            ".read": "auth != null && root.child('readWriteUsers').hasChild(auth.uid)",
            ".write": false   
    }

  }
}

Однако в вашей модели данных возникнет проблема, поскольку вы создаете несколько stores в качестве базы данных.корневые узлы.Каждый раз, когда вы создаете новое хранилище, вам необходимо обновлять правила безопасности!

Вам необходимо создавать эти хранилища в родительском узле, например, stores.Следовательно, с новыми узлами readUsers и readWriteUsers ваша база данных будет выглядеть следующим образом:

- task-list-for-managers
   - stores
     - Store01
        - ....  
     - Store02
        - ....    
   - readUsers
     - WV0676TY67TY9: true   //user Id
     - PU8776TIU6543: true   
     - .....
   - readWriteUsers
     - BD563DHDV7669: true   //user Id
     - 87RSBE6383912: true   
     - .....

И правила будут следующими:

{
  "rules": {

    "stores": {
            ".read": "auth != null && (root.child('readUsers').hasChild(auth.uid) || root.child('readWriteUsers').hasChild(auth.uid))",
            ".write": "auth != null && root.child('readWriteUsers').hasChild(auth.uid)"
      },

    "readUsers": {
            ".read": "auth != null && root.child('readUsers').hasChild(auth.uid)",
            ".write": false   
    },


    "readWriteUsers": {
            ".read": "auth != null && root.child('readWriteUsers').hasChild(auth.uid)",
            ".write": false   
    }

  }
}

Обратите внимание, что, как объяснено здесь , каскад правил чтения и записи:

Если правило предоставляет разрешения на чтение или запись по определенному пути, то оно также предоставляет доступ ко всем дочерним узлам в нем..

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