Firestore 安全规则 - 检查字符串是否可以转换为 int

时间:2021-04-07 21:02:54

标签: google-cloud-firestore firebase-security

this page 展示了如何将字符串转换为整数:

int("2") == 2
int(2.0) == 2

但是在进行转换之前我怎么知道它是否会工作或抛出异常?

例如,我如何实现以下内容:

IF x can be cast to an integer THEN return int(x) < 10
ELSE IF y can be cast to an integer THEN return int(y) < 10
ELSE return false

1 个答案:

答案 0 :(得分:2)

您可以使用下面定义的 cast_as_int 函数:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function cast_as_int(x) {
      let pattern = '[+-]?([0-9]*[.])?[0-9]+';
      return (
        (x is float)
        || (x is int)
        || (x is string) && (x.matches(pattern))
      ) ? int(float(x)) : null;
    }

    // All gets will succeed
    match /{document=**} {
      allow get: if cast_as_int(1) == 1
        && cast_as_int('2') == 2
        && cast_as_int('3.14') == 3
        && cast_as_int(4.44) == 4
        && cast_as_int("5!") != 5;
    }
  }
}

该函数接受一个变量并返回一个 33448 或 null。 Firestore 不允许语句评估为多种类型,因此该函数只能返回 Integernull(而不是请求的 false)。

该函数假设您要从(整数或浮点数)转换为整数。如果您只想从整数转换为整数,则将 int(float(x)) 替换为 int(x)

let pattern = '[+-]?([0-9]*[.])?[0-9]+' 的正则表达式被采用 Integer