Правило безопасности Firestore .hasAny (['A', 'B', 'C']) все еще доступно для использования? - PullRequest
0 голосов
/ 28 июня 2018

Не могу использовать правило безопасности Firestore .hasAny (). Этот метод устарел или больше не доступен?

enter image description here

Я использую это как

/// Functions - NOT WORKING!!! ///
function isTeamMember(teamId, userId) {
  return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId].hasAny(['OWNER', 'ADMIN', 'STANDARD'])
}

Данные Firestore структурированы как таковые

- team_access_privilege (COLLECTION)
-- teamId (DOCUMENT)
--- userId1 (KEY) : 'OWNER' (VALUE)
--- userId2 (KEY) : 'ADMIN' (VALUE)
--- userId3 (KEY) : 'ADMIN' (VALUE)
--- userId4 (KEY) : 'STANDARD' (VALUE)

В этой команде 4 пользователя.

Я также проверил, что нижеуказанные функции работают хорошо.

/// Functions - Working Well ///
    function isOwnerOfTeam(teamId, userId) {
      return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId] == 'OWNER'
    }

Моя цель - убедиться, что, пока userId существует в team_access_privilege, он / она может получить доступ к данным. Я пытался использовать exist () , но симулятор запускается вечно. Я отказываюсь от использования exist () . Я не уверен, что это известная проблема.

Ниже это займет вечность

/// Functions - Not working too ///
    function isTeamMember(teamId, userId) {
      return exists(get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId])
    }

В общем, моя цель - убедиться, что пользователь является «ВЛАДЕЛЕЦОМ», «АДМИНИСТРОМ» или «СТАНДАРТОМ» команды для чтения / записи данных.


Редактировать 1

Пробовал ответ @Doug Stevenson, и он НЕ работает

['OWNER', 'ADMIN', 'STANDARD'].hasAny([get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId]])

Это сообщение об ошибке. enter image description here

Я попробовал другой подход, и он сработал.

/// Functions - Working Well ///
    function isOwnerOfTeam(teamId, userId) {
      return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId] == 'OWNER'
    }

/// Functions - Working Well ///
    function isAdminOfTeam(teamId, userId) {
      return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId] == 'ADMIN'
    }

/// Functions - Working Well ///
    function isStandardOfTeam(teamId, userId) {
      return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId] == 'STANDARD'
    }

/// Functions - Then This WOrks ///
    function isTeamMember(teamId, userId) {
      return isOwnerOfTeam(teamId, userId) || isAdminOfTeam(teamId, userId) || isStandardOfTeam(teamId, userId)
    }

['', '', ''] .hasAny (get ()) не работает. Так что get (). HasAny (['', '', '']). Exists не работает так же хорошо для моей указанной структуры данных.

Это просто загадочно. Во всяком случае, у меня есть действующее правило безопасности на данный момент. Надеюсь, @Doug Stevenson может помочь найти более эффективный способ проверить, является ли пользователь «ВЛАДЕЛЕЦОМ», «АДМИНИСТРОМ» или «СТАНДАРТОМ» команды для чтения / записи данных.

1 Ответ

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

hasAny - это метод для типов массивов, , как описано здесь в ссылке на правила . Вы используете его, чтобы определить, содержит ли поле типа списка какое-либо из значений в данном списке. Кажется, вы пытаетесь использовать его в строке.

Возможно, вы можете использовать его в обратном направлении, чтобы выяснить, является ли строковая роль идентификатора пользователя одной из трех указанных ролей:

['OWNER', 'ADMIN', 'STANDARD'].hasAny([get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId]])
...