Firebase安全规则

时间:2014-01-25 12:49:49

标签: firebase firebase-security

我是Firebase的新手,并且非常挣扎于安全规则。

我正在尝试为只能由该用户访问的匿名用户会话存储数据,但是一旦我收紧安全规则,我就会获得权限被拒绝,并且无法解决原因。

我的结构是:

/ userSessions / $用户/ USER_ID

应用程序推送到用户会话并写入匿名登录返回的user_id。

我有以下安全规则:

{
  "rules": {
    ".read": true,
    "userSessions": {
      "$user": {
        ".write": "newData.child('user_id').val() == auth.id",
        "user_id": {
          ".validate": "newData.isString()"
        }
      }
    }
  }
}

我确定我做的事情很傻,但无法解决如何使用安全模拟器,所以不知道如何解决这个问题

任何帮助非常感谢

编辑 - 在匿名身份验证后尝试在userSessions下创建新条目时出现问题。

代码:

var userSessionsRef = new Firebase('https://xxxxxx.firebaseio.com/userSessions');
var userSession;
var auth = new FirebaseSimpleLogin( userSessionsRef, function(error,user) {
    if (error) {
        console.log(error);
    } else if (user) {
        userSessionsRef.child(user.id).set({
            user_id: user.id,
            provider: user.provider,
            created: Firebase.ServerValue.TIMESTAMP
            });
    userSession = new Firebase('https://xxxxx.firebaseio.com/userSessions/'+user.id);
    userSession.onDisconnect().remove();
}

1 个答案:

答案 0 :(得分:2)

你提供的set()操作运行得很好;没有错误;在这里必须有另一个问题,你没有在你的repro中捕获(你是否在Forge中启用了匿名身份验证?)。这是一个按照您的安全规则运行的小提琴,逐行复制(仅向下移动一个子路径):http://jsfiddle.net/katowulf/wxn5J/

在相关说明中,您当前的安全规则将不允许userSession.onDisconnect().remove(); op,因为只有newData()包含user_id值(即它不能为null)才能写入记录。构建这些安全规则的更好方法如下:

{
  "rules": {
    ".read": true,
    "userSessions": {
      "$user": {
        ".write": "$user === auth.id", // delete allowed
        "user_id": {
          ".validate": "newData.isString() && newData.val() === $user"
        }
      }
    }
  }
}