4

我很难想象一个看起来像这样的应用程序的安全规则会是什么样子:

  • 一个带有多个聊天室的火力基地。
  • 主持人通过单独的 PHP 应用程序进行身份验证。
  • 版主只有修改自己聊天室的权限,他们可以读取、写入、更新和删除聊天室中的任何内容。
  • 客人到达并通过单独的 PHP 应用程序进行身份验证。
  • 来宾具有读写权限,但不能删除任何内容。

我现在的问题是:

  1. 是否可以配置规则来满足所有这些要求?还是有一些无法满足的要求?

  2. PHP 服务器必须在多大程度上与 Firebase 通信,以通知 Firebase 用户的存在?

4

1 回答 1

9

首先,看看这个 gist,这是我前段时间为多个聊天室设计的一个例子。

  1. 是的。这是完全可能的。
  2. 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 应用程序进行身份验证。 使用自定义登录模块为管理员创建 Firebase 令牌。根据您存储在该令牌中的数据应用安全规则。

版主只有修改他们自己的聊天室的权限... 这应该很容易解释,只需扩展上面的用户权限。

客人到达并通过单独的 PHP 应用程序进行身份验证。 使用自定义登录模块为管理员创建 Firebase 令牌。根据您存储在该令牌中的数据应用安全规则。

(或者废弃 PHP 应用程序,只使用Firebase 的内置身份验证!)

来宾具有读写权限,但不能删除任何内容。 在“.write”规则中使用 newData.exists() 或 newData.hasChildren(...) 来防止删除。

客人不能欺骗其他客人。 身份验证令牌将阻止这种情况

于 2013-08-01T02:51:52.483 回答