我是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();
}
答案 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"
}
}
}
}
}