我很难想象一个看起来像这样的应用程序的安全规则会是什么样子:
- 一个带有多个聊天室的火力基地。
- 主持人通过单独的 PHP 应用程序进行身份验证。
- 版主只有修改自己聊天室的权限,他们可以读取、写入、更新和删除聊天室中的任何内容。
- 客人到达并通过单独的 PHP 应用程序进行身份验证。
- 来宾具有读写权限,但不能删除任何内容。
我现在的问题是:
是否可以配置规则来满足所有这些要求?还是有一些无法满足的要求?
PHP 服务器必须在多大程度上与 Firebase 通信,以通知 Firebase 用户的存在?
我很难想象一个看起来像这样的应用程序的安全规则会是什么样子:
我现在的问题是:
是否可以配置规则来满足所有这些要求?还是有一些无法满足的要求?
PHP 服务器必须在多大程度上与 Firebase 通信,以通知 Firebase 用户的存在?
首先,看看这个 gist,这是我前段时间为多个聊天室设计的一个例子。
数据结构基本如下:
# chats roughly equal "rooms"
/chats/chat_id/users/...
# a timestamp of when each participant last viewed the room
/chats/chat_id/last/...
# the messages sent
/chats/chat_id/messages/...
安全规则是自我记录的。这是参考完整性的本地副本。
{
"chat": {
// the list of chats may not be listed (no .read permissions here)
// a chat conversation
"$key": {
// if the chat hasn't been created yet, we allow read so there is a way
// to check this and create it; if it already exists, then authenticated
// user (specified by auth.account) must be in $key/users
".read": "auth != null && (!data.exists() || data.child('users').hasChild(auth.account))",
// list of users authorized to participate in chat
"users": {
// if the list doesn't exist, anybody can create it
// if it already exists, only users already in the list may modify it
".write": "!data.exists() || data.hasChild(auth.account)",
"$acc": {
// for now the value is just a 1, later it could be a read/write/super privilege
".validate": "newData.isNumber()"
}
},
// timestamps recording last time each user has read this chat
"last": {
"$acc": {
// may only written by the authenticated user and if user is in $key/users
".write": "$acc === auth.account && root.child('chat/'+$key+'/users').hasChild($acc)",
".validate": "newData.isNumber()"
}
},
"messages": {
"$msg": {
// to write a message, it must have all three fields (usr, ts, and msg)
// and the person writing must be in $key/users
".write": "root.child('chat/'+$key+'/users').hasChild(auth.account)",
".validate":"newData.hasChildren(['ts', 'usr', 'msg'])",
"usr": {
// may only create messages from myself
".validate": "newData.val() === auth.account"
},
"msg": {
".validate": "newData.isString()"
},
"ts": {
".validate": "newData.isNumber()"
}
}
}
}
}
}
主持人通过单独的 PHP 应用程序进行身份验证。 使用自定义登录模块为管理员创建 Firebase 令牌。根据您存储在该令牌中的数据应用安全规则。
版主只有修改他们自己的聊天室的权限... 这应该很容易解释,只需扩展上面的用户权限。
客人到达并通过单独的 PHP 应用程序进行身份验证。 使用自定义登录模块为管理员创建 Firebase 令牌。根据您存储在该令牌中的数据应用安全规则。
(或者废弃 PHP 应用程序,只使用Firebase 的内置身份验证!)
来宾具有读写权限,但不能删除任何内容。 在“.write”规则中使用 newData.exists() 或 newData.hasChildren(...) 来防止删除。
客人不能欺骗其他客人。 身份验证令牌将阻止这种情况