我正在尝试创建一个基于的安全规则请求时间如上的示例所示Angular Firebase 网站.
我的功能是
function isThrottled() {
return request.time < resource.data.lastUpdate + duration.value(1, 'm')
}
我正在努力的地方allow update: if isThrottled() == false
但是,当我尝试使用此规则更新文档时,由于以下原因而失败time未在对象上定义。
错误:simulator.rules 行 [169],列 [12]。产权时间为
对象上未定义。
不应该每个请求都有一个time
or TimeStamp
附在它上面?这与我初始化 Cloud Functions 或客户端应用程序的方式有关吗?
截图如下:
EDIT
其余更新安全规则的片段如下:
service cloud.firestore {
match /databases/{db}/documents {
match /users/{userId} {
match /username/{id} {
allow update: if isSelf(userId)
&& usernameAvailable(incomingData().username)
&& incomingData().username is string
&& incomingData().username.size() <= 25
&& incomingFields().size() == 1
&& isThrottled() == false;
}
}
function incomingData() {
return request.resource.data
}
function isThrottled() {
return request.time < resource.data.lastUpdate + duration.value(1, 'm')
}
function incomingFields() {
return incomingData().keys()
}
function isSelf(userId) {
return userId == currentUser().uid;
}
function usernameAvailable(username) {
return !exists(/databases/$(db)/documents/usernames/$(username));
}
}
}
The username
集合是每个集合下的子集合user
文档(在users
根集合。每个username
文档只有 1 个名为username
用户可以更新)。
这可能对您的情况特别没有用,但在检查令牌对象上的自定义声明时我遇到了同样的错误。
在访问该字段之前,您可以使用in
检查对象上是否存在该属性。如果未定义代理,此代码会生成错误:
allow write: if request.auth != null && request.auth.token.agent == true;
如果未定义代理,此代码可以正常工作:
allow write: if request.auth != null && "agent" in request.auth.token && request.auth.token.agent == true;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)