我正在使用firbase数据库,我试图设置规则来限制用户的写访问权限,这些用户的uid与他们试图写的对象的userId节点相匹配,并且仍然允许写来创建一个新对象,例如不存在的新帖子。所以允许新帖子,允许编辑自己的帖子,但是如果帖子存在,但不属于用户,则拒绝写。
比如:
"posts": {
".write": "auth !== null && posts.post.userId.val() === auth.uid
}
或者类似的
//where posts.post represents objectRef.objectUpdating
"rules":{
".write": " auth !== null && posts.post.userId.val() === auth.uid
}
帖子。postid对象更新如下:
firebase.database().ref('posts').child(id).update(updates)
以下是帖子的外观示例。线程和论坛遵循相同的结构。
"posts": {
"-KsjWehQ--apjDBwSBCZ": {
"edited": {
"at": 1504037546,
"by": "ALXhxjwgY9PinwNGHpfai6OWyDu2"
},
"publishedAt": 1504035908,
"text": "some post text",
"threadId": "-KsjWehQ--apjDBwSBCY",
"userId": "ALXhxjwgY9PinwNGHpfai6OWyDu2"
},
...{post2},
...{etc}
}
希望这是有意义的,任何帮助都是感激的。
编辑:我得到了它,所以当调用update或create方法时,它会检查数据是否正确。userId与auth相同。uid。更新现有数据现在起作用了。
创建方法不工作虽然,我不知道如何允许更新()创建新的职位或线程像以前没有更新如果userId不匹配auth.uid.
规则如下:
{
"rules": {
".read": true,
"users": {
".indexOn": ["usernameLower", "email"],
"$user": {
".write": "auth !== null && $user === auth.uid"
}
},
"forums": {
".write": false
},
"categories": {
".write":false
},
"$resource": {
"$child": {
".write": "(auth !== null && auth.uid === data.child('userId').val()) || data.val() === null"
}
}
}
}
我设法让它运转起来。以帖子为例:
"posts":{
"$post":{
".write": "(auth !== null && auth.uid === data.child('userId').val()) || (!data.exists() && auth !== null)"
}
}
如果有更好的方法来做这件事,或者如果我是多余的或忽略了什么,请不要犹豫,发表评论,让我知道,我仍然是Firebase的新手,任何输入都是值得赞赏的。
以下是我的规则以供参考。我不清楚的一件事是,我是否必须在我的其他写入规则下面将“.write”设置为false,以防止写入任何其他数据,或者如果默认情况下处理了这些数据。
{
"rules": {
".read": true,
"users": {
".indexOn": ["usernameLower", "email"],
"$user": {
".write": "auth !== null && $user === auth.uid"
}
},
"categories": {
".write": false
},
"forums": {
"$forum":{
"lastPostId": {
".write": "auth !== null"
},
"threads": {
".write": "auth !== null"
}
}
},
"posts": {
"$post": {
".write": "(auth !== null && auth.uid === data.child('userId').val()) || (!data.exists() && auth !== null)"
}
},
"threads": {
"$thread": {
"$child":{
".write": "auth !== null"
},
".write": "(auth !== null && auth.uid === data.child('userId').val()) || (!data.exists() && auth !== null)"
}
},
"$resource": {
"$child": {
"$child2": {
".write": "auth !== null"
},
"userId": {
".write": "!data.exists()"
}
}
}
}
}
作为参考,以下是为在数据库中创建新职位而传递给date()的更新:
const updates = {}
updates[`posts/${postId}`] = post
updates[`threads/${post.threadId}/posts/${postId}`] = postId
updates[`threads/${post.threadId}/contributors/${post.userId}`] = post.userId
updates[`users/${post.userId}/posts/${postId}`] = postId
firebase.database().ref().update(updates)
问题内容: 我正在将实时数据库与Google的Firebase结合使用,并且正在尝试检查是否存在孩子。 我的数据库结构如下 我想检查room1是否存在。我尝试了以下方法: 在访问它时,返回该房间属性的JSON,但是我如何检查room()是否从那里开始呢? 评论是否需要任何澄清 问题答案:
问题内容: 我是通过Android(Java)刚接触Firebase的,并且想知道如何检查用户是否已存在以下格式的数据库中: 例如,按下按钮后,我想检查Firebase以查看用户名“ Michael”是否存在(对象michael中的第一级michael-而不是“ michael”。 谢谢 问题答案: 使用方法或onDataChange中的SingleValueEvent
我正在努力解决firebase实时数据库的安全规则。我的数据库结构如下: 第一层是聊天。第二层是聊天伙伴(包含聊天伙伴用户ID的串联字符串)。在第三层,你有这些信息。在最后一个级别上有变量datetime、userid和message。 我的问题是,我如何进入第二个子节点,例如检查auth.uid是否在连接的字符串中。我的想法是,如果用户ID在聊天伙伴字符串中,则给予用户读取权限,以确保只有聊天伙
我有一个相当简单的情况,我想在我的规则条件中检查一个属性是否为空。 我在调试中跟踪了这一点。正在插入一个Fact,属性为null,但规则仍然会触发。控制台输出如下。 如果我将条件更改为,则规则不会触发。所以它似乎与我所期望的完全相反。 我们确实有一个使用函数的解决方法,但它有点难看,我不明白为什么它首先不起作用。 编辑1 口水版本是5.3.0。 事实是通过另一条规则加载的,该规则使用来自的和服务方
问题内容: 我试图找到最大的立方根,即整数,小于12,000。 我不确定如何检查它是否是整数!我可以将其转换为字符串,然后使用索引来检查最终值,看看它们是否为零,但这似乎很麻烦。有没有更简单的方法? 问题答案: 要检查浮点值是否为整数,请使用以下方法: 该方法已添加到Python 2.6中的类型中。 请考虑在Python 2中为(整数操作数的底数除法!),并且浮点算术可能不精确(a是使用二进制分数
我尝试用规则返回用户聊天列表。所以我不知道对话的id。我尝试了几种方法,但都不起作用,因为你必须知道聊天id。 数据库: 规则: 但当我从react本机应用程序访问时。通过身份验证的用户无法访问聊天记录(uid:3Oi1atf8l2P4Vgsb8tZOGxpUg7q2) *读取失败:错误:权限被拒绝/Chats:客户端没有访问所需数据的权限。 规则: 查询: