2014-01-25 92 views
2

我是新来的火力地堡,真正与安全规则挣扎。火力地堡安全规则

我想存储的数据只能由该用户进行访问,但匿名用户会话,只要我收紧的安全规则,我得到拒绝的权限,并不能明白为什么。

我的结构是:

/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(); 
} 
+0

当您获取权限被拒绝时,您想做什么? –

+0

下创建userSessions一个新的$用户 - 我会更新的问题 –

+0

嗨@JonReeves!当你在模拟器中试用时,你会得到什么?另外,它似乎很可能是user.id是一个数字(我假设你使用Twitter或Facebook?他们都返回数字ID)。另外,哪些数据正在设置?你可以登录用户对象,并在这里发布?您可以为我们提供更多的数据,使您能够轻松快速地进行故障排除。 – Kato

回答

2

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

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

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

谢谢。试过这些规则,但仍然被拒绝。在Forge中肯定有启用匿名身份验证。不知道我在这里做错了什么。从好的方面来说,模拟器现在正在工作,但我不知道如何使用它来测试匿名认证,因为它不给我用户ID,所以我没有办法用它来测试写入? –

+0

使用你的代码以及我的firebase作品 - 肯定在某处出了问题。非常感谢您的帮助 –