首先,check out this gist,这是我前段时间为多个聊天室设计的示例。
- 是的。完全有可能。
- PHP 服务器?你不需要服务器! :)
数据结构基本如下:
# 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 应用程序进行身份验证。
使用 custom login module 为管理员创建 Firebase 令牌。根据您存储在该令牌中的数据应用安全规则。
版主只能修改自己的聊天室...
通过简单地扩展上面的用户权限,这应该是不言自明的。
访客通过单独的 PHP 应用程序到达并进行身份验证。
使用 custom login module 为管理员创建 Firebase 令牌。根据您存储在该令牌中的数据应用安全规则。
(或者废弃 PHP 应用程序,直接使用Firebase's baked in authentication!)
访客具有读写权限,但不能删除任何内容。
在“.write”规则中使用 newData.exists() 或 newData.hasChildren(...) 来防止删除。
客人不能欺骗其他客人。
身份验证令牌将防止这种情况发生