2

我是 Firebase 的新手,并且真的在安全规则方面苦苦挣扎。

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

我的结构是:

/userSessions/$user/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();
}
4

1 回答 1

2

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

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

{
  "rules": {
    ".read": true,
    "userSessions": {
      "$user": {
        ".write": "$user === auth.id", // delete allowed
        "user_id": {
          ".validate": "newData.isString() && newData.val() === $user"
        }
      }
    }
  }
}
于 2014-01-27T21:20:43.843 回答