我想通过客户端发送Firestore文档的创建时间,并使用 Firestore规则验证时间,以避免调用Cloud Functions(定价)。
我正在按照这样的Firestore规则测试来自客户端的请求:
allow create: if request.resource.data.TIMEFIELD == request.time;
该请求包含一个带有时间戳的TIMEFIELD
,就像request.time
一样。
显然,请求时间和我在发送请求之前立即设置为字段的时间是不相等的,因此无法进行比较。
以下是request.time
在文档中的定义。
我想知道是否有一种方法可以在文档中设置等于request.time
的字段。
由于an issue with Flutter,我无法使用服务器端时间戳。
因此,我需要知道如何使用Firestore Rules验证time.now
之类的客户端时间戳。
答案 0 :(得分:1)
您可以使用Timestamp
向时间字段(docs)添加约束。
以下是如何确保更改在一定秒数内的示例:
function withinSeconds(secs) {
return request.resource.data.TIMEFIELD.seconds() - request.time.seconds() <= secs
&& request.resource.data.TIMEFIELD.seconds() - request.time.seconds() >= -secs
}
以上内容用于在request.time
的阈值内设置值。
同时,您也可以只使用REST API。只需提出一个包含write
和update
的{{1}}请求即可。 transform
是您设置服务器时间戳的地方。 Here是帮助理解如何构建请求的工具。
答案 1 :(得分:0)
您首先必须记住创建(或最后更新)时间戳:
firestore().collection("items").add({
....
created: firebase.firestore.FieldValue.serverTimestamp()
});
为了让客户端知道时间戳,您稍后将尝试比较该时间戳。
答案 2 :(得分:0)
目前,拥有准确时间戳(带有服务器时间)的唯一方法是with the help of Cloud Functions。
这是由于 Flutter当前不支持 template<typename OriginalMatrix2D, typename RotatedMatrix2D>
void rotate_2d_matrix_clockwise_impl(OriginalMatrix2D const & original_matrix,
RotatedMatrix2D & rotated_matrix,
int const M,
int const N)
{
for (auto x = 0; x < N; ++x) {
for (auto y = 0; y < M; ++y) {
// Source : https://stackoverflow.com/questions/4780119/2d-euclidean-vector-rotations
rotated_matrix[y][-x -1 +N] = original_matrix[x][y];
}
}
}
#include <iostream>
#include <vector>
#include <array>
template<typename Matrix2D>
void print_matrix(Matrix2D const & vec)
{
std::cout << "size of matrix is [" << vec[0].size() << " x " << vec.size() << "]\n";
for (auto const & inner_vec : vec) {
for (auto const & item : inner_vec) {
std::cout << item << ", ";
}
std::cout << std::endl;
}
}
template<typename OriginalMatrix2D, typename RotatedMatrix2D>
void rotate_2d_matrix_clockwise_impl(OriginalMatrix2D const & matrix,
RotatedMatrix2D & rotated_matrix,
int const M,
int const N)
{
for (auto x = 0; x < N; ++x) {
for (auto y = 0; y < M; ++y) {
// Source : https://stackoverflow.com/questions/4780119/2d-euclidean-vector-rotations
rotated_matrix[y][-x -1 +N] = matrix[x][y];
}
}
}
template<typename T, size_t M, size_t N>
auto rotate_2d_matrix_clockwise(std::array<std::array<T, M>, N> const & original_matrix)
-> std::array<std::array<T, N>, M>
{
std::array<std::array<T, N>, M> rotated_matrix;
rotate_2d_matrix_clockwise_impl(original_matrix, rotated_matrix, M, N);
return rotated_matrix;
}
template<typename Matrix2D>
auto rotate_2d_matrix_clockwise(Matrix2D const & original_matrix) -> Matrix2D
{
int const M = original_matrix[0].size();
int const N = original_matrix.size();
Matrix2D rotated_matrix;
rotated_matrix.resize(M);
for (auto x = 0; x < M; ++x) {
rotated_matrix[x].resize(N);
}
rotate_2d_matrix_clockwise_impl(original_matrix, rotated_matrix, M, N);
return rotated_matrix;
}
int main()
{
std::array<std::array<int, 4>, 3> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
std::cout << "\nBefore Rotation :\n";
print_matrix(data);
std::cout << "\nAfter 2nd Clockwise Rotation :\n";
print_matrix(rotate_2d_matrix_clockwise(rotate_2d_matrix_clockwise(data)));
std::vector<std::vector<char>> data2 = { {'a', 'b', 'c', 'd'}, {'e', 'f', 'g', 'h'}, {'i', 'j', 'k', 'l'}};
std::cout << "Before Rotation :\n";
print_matrix(data2);
std::cout << "\nAfter Clockwise Rotation :\n";
print_matrix(rotate_2d_matrix_clockwise(data2));
return 0;
}
和云函数。
您可以track this ongoing issue关于FieldValue
在Flutter Cloud Firestore插件中的实现。