Firebase FireStore сложные правила безопасности - PullRequest
0 голосов
/ 01 октября 2018
У

есть одно приложение, в котором у нас есть несколько communities и пользователь, у которого есть роли для write сообщения.В каждом сообществе есть пользователи под своим крылом ({communityId}/meta_users/{uid}). Я написал функцию для доступа к ролям пользователя, я пытался просмотреть документ, но не смог подать какую-либо помощь.При моделировании я проверяю, что userRoleLevel не позволит читать, даже если пользователю назначена роль («admin»).пожалуйста, помогите мне исправить это.Я вставил фрагмент правила ниже.дайте мне знать, если нужно больше информации

function userRoleLevel(community){
  return exists(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level)
  && get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
}

service cloud.firestore {
  match /databases/{database}/documents {
    // All read is allowed for now.
    match /{document=**} {
      allow read;
    }


    match /communities/{community} {
      allow write: if owner();
      match /{category}/{message}{
       allow write: if loggedIn() 
       && (userRoleLevel(community) in ['owner', 'admin', 'writer']);
      }

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

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

Решение состоит в том, чтобы переместить эту функцию в схему базы данных.

    service cloud.firestore {
      match /databases/{database}/documents {
        // All read is allowed for now.
        match /{document=**} {
          allow read;
        }
        // function should be located here <--------
        function userRoleLevel(community){
      return get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
    }
...
}

Надеюсь, это поможет и другим.

0 голосов
/ 12 октября 2018

У вас есть функция userRoleLevel(), возвращающая логическое значение вместо строки, содержащей роль.Вы не сможете использовать userRoleLevel(community) in ['owner', 'admin', 'writer'], если не выполните следующее.

function userRoleLevel(community){
  if( exists(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level) ) {
    return get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
  } else {
    return false; // return something that won't match your roles
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...