В нашей настройке Firebase мы храним роль пользователя в пользовательских утверждениях. Итак, в наших правилах безопасности Cloud Firestore нам нужно оценить, имеет ли пользователь соответствующую роль для выполнения действия. Поэтому я создал функцию getRole
, которая удобно получает запрошенное значение из токена авторизации пользователя. Однако существуют определенные крайние случаи, когда пользователь еще не имеет роли, и в этих случаях я хочу, чтобы его роль оценивалась как минимальная роль безопасности, в нашем случае это просто "user"
. Я прочитал язык spe c для CEL (Common Expression Language), на котором основан этот язык правил, и на самом деле он поддерживает троичный оператор. ( Do c). Поэтому я пошел и включил этот код в свои правила безопасности Firestore, и онлайн-редактор проверил правила и принял мои новые правила. Однако позже я обнаружил, что локально, когда я запускаю свои модульные тесты правил безопасности, а также загружаю правила в эмуляторах Firebase, я получаю эту ошибку:
ERROR Use of ternary operator not allowed
Так что либо производство Правила Firestore поддерживают троичного оператора, а локальные эмуляторы - нет, либо производственный проверяет соответствие CEL и проходит проверку, когда это не нужно.
В любом случае, я бы хотел иметь возможность безопасно иметь функцию, которая возвращает фактическое значение роли пользователя или безопасное значение по умолчанию, если оно не установлено.
Обратите внимание что мы попытались опустить оператор 'role' in getCustomClaims()
, и он взрывается, если ключ не существует в пользовательских утверждениях.
function getCustomClaims() {
return request.auth.token;
}
function getRole() {
return 'role' in getCustomClaims() ? getCustomClaims()['role'] : 'user';
}