小编Rat*_*met的帖子

Firebase Firestore 规则:正在检查的文档的 get() 操作会算作另一次读取吗?

我在 Firestore 安全规则中有这样的代码(仅显示相关部分):

match /users/{userId} {
    function isUserDisabled(userId) {
        return get(/databases/$(database)/documents/users/$(userId))
                    .data.admin == true;
    }

    allow read:  if true;
    allow write: if request.auth.uid == userId
                 && !isUserDisabled(userId);

    match /posts/{postId} {
        allow read:  if true;
        allow write: if request.auth.uid == userId
                     && !isUserDisabled(userId);
    }
}
Run Code Online (Sandbox Code Playgroud)

isUserDislabled()是一个将在多个地方调用的函数。它将通过get()用户的文档来查看用户是否被禁用。

问题是,第一次调用 会isUserDislabled()导致get()检查文档,从而导致额外的读取成本吗?据我了解,get()同一文档的多个内容将仅收取一次费用。但是,在本例中,它仅get()适用于特定文档。

编辑1:看来我的问题并不完全是我的意思。(我的母语不是英语。)问题是,当get()to/users/{userId}发生在match /users/{userId}块(而不是子块)中时,会get()导致额外读取吗?换句话说,使用get()和使用resource变量之间(当然,当它引用同一个文档时),其成本是否相同?

firebase firebase-security google-cloud-firestore

6
推荐指数
1
解决办法
833
查看次数

如何在不了解密钥的情况下在Firestore规则中强制执行映射中的值?

我正在尝试在Firestore的文档中实现类似于"使用数组,列表和集合"的示例,但是对于用户访问控制列表.

在文档中,将有一个modified时间戳users字段和一个映射字段,其中包含用户的UID作为键,修改后的时间戳作为值(以便我可以使用此字段进行排序).

{
    modified: 2018-01-01T17:05:00Z,
    users: {
        someUID: 2018-01-01T17:05:00Z,
        otherUID: 2018-01-01T17:05:00Z
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

很明显,我必须保持usersmap中的值与modified字段同步.因为我不想在文档更新时支付云函数调用和文档写入,所以我计划在客户端上进行更新,同时更新文档本身.

问题是,如何使用Firestore安全规则强制执行usersmap 的值,以便它始终与修改后的字段同步?此地图的关键字事先未知,此地图的大小也可以变化.

firebase firebase-security google-cloud-firestore

5
推荐指数
1
解决办法
565
查看次数

如何匹配除选项卡之外的所有内容(对于 git diff --word-diff-regex)

我正在尝试使用git diff --word-diff-regex[1]进行 word-diff 。基本上,此正则表达式的任何匹配都被视为一个单词。我的文档是一个制表符分隔的文本文件,每列可能包含空格字符。所以,我尝试使用否定字符类,--word-diff-regex='[^\t]+',它应该匹配除制表符之外的所有内容,一次或多次。但是,它不起作用。正则表达式似乎与线上的所有内容相匹配。

例如,对于文本20<\t>Hello, Worlddiff 20<\t>Hello, Diff<\t>表示制表符),git 应该显示差异在于整个“Hello, {World,Diff}”,而不是“World”或“Diff”本身。[^\t]+但是,使用会导致 git 显示整行是更改的单个单词。

经过进一步研究,似乎 git 在内部使用了 POSIX 的 regex 函数。在 POSIX 的无限智慧中,似乎我“无法逃避字符类中的任何内容”,因为“[t]hey 将字符类中的反斜杠视为文字字符”[2]。

受另一个 StackOverflow 答案 [3] 的启发,我目前通过使用“否定速记字符类”来解决这个问题,(\S| )+. 这匹配任何非空白字符,加上空白字符本身。这实际上允许我在我的情况下做 word-diff,但我的问题仍然存在,因为这个正则表达式不会匹配其他空白字符。

所以,问题是,如何在 POSIX(扩展)正则表达式(或 GNU 扩展)中匹配“除制表符之外的所有内容”,使用或不使用字符类,而不拼写空白类中的所有其他字符?例如,我不想要(\S| |\n|\r|<other whitespace characters>)+.

[1] https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---word-diff-regexltregexgt

[2] https://www.regular-expressions.info/charclass.html,“字符类中的元字符”部分

[3] /sf/answers/242840881/

regex git posix

5
推荐指数
1
解决办法
123
查看次数