Firebase 安全规则不起作用
Firebase security rules not works
我在 Web 应用程序中使用 Firebase 身份验证,并且我使用 Phone 号码身份验证作为登录应用程序的选项。
function saveUser(fname) {
var user = firebase.auth().currentUser;
var newUserRef = firebase.database().ref('users/' + user.uid);
newUserRef.set({
fname: fname
});
}
在以下数据库规则下:
{
"rules" : {
".read" : false,
".write" : false,
// only authenticated users can write
"users": {
".read": "auth != null",
"$user_id": {
"fname": {
".read": "auth != null",
".write": "auth != null",
".validate": "newData.isString() && newData.val().matches(/^[A-Z]{3,}$/)"
},
}
}
}
}
但是,我一直收到错误消息:
FIREBASE WARNING: set at /users/ypGXpJRM1wdMOuOMf8F7quLnJ073 failed:
permission_denied
有没有办法在不改变规则的情况下避免这个错误?
这些规则阻止所有访问:
".read" : false,
".write" : false,
您可以在 Firebase 数据库规则模拟器工具中轻松测试您的数据库安全规则。
您的规则允许写入的第一个级别在 /users/$uid/fname
。但是您的代码试图写入 /users/$uid
。由于你在那里没有写权限,数据库拒绝写操作。
您有两种选择来解决此问题:允许写入 /users/$uid
,或写入 /users/$uid/fname
。
允许写入 /users/$uid
要允许写入 /users/$uid
,请将您的规则更改为:
"users": {
".read": "auth != null",
"$user_id": {
".write": "auth != null",
"fname": {
".read": "auth != null",
事实上,您可能希望确保用户只能编写他们自己的节点,您可以这样做:
"users": {
".read": "auth != null",
"$user_id": {
".write": "auth.uid === $uid",
"fname": {
".read": "auth != null",
写信给/users/$uid/fname
您当前的写入代码试图写入您没有权限的地方。由于您只写了 fname
,您还可以写入该特定位置以消除错误:
var newUserRef = firebase.database().ref('users/' + user.uid);
newUserRef.child('fname').set(fname);
考虑到数据结构,我可能会修改安全规则。
我在 Web 应用程序中使用 Firebase 身份验证,并且我使用 Phone 号码身份验证作为登录应用程序的选项。
function saveUser(fname) {
var user = firebase.auth().currentUser;
var newUserRef = firebase.database().ref('users/' + user.uid);
newUserRef.set({
fname: fname
});
}
在以下数据库规则下:
{
"rules" : {
".read" : false,
".write" : false,
// only authenticated users can write
"users": {
".read": "auth != null",
"$user_id": {
"fname": {
".read": "auth != null",
".write": "auth != null",
".validate": "newData.isString() && newData.val().matches(/^[A-Z]{3,}$/)"
},
}
}
}
}
但是,我一直收到错误消息:
FIREBASE WARNING: set at /users/ypGXpJRM1wdMOuOMf8F7quLnJ073 failed: permission_denied
有没有办法在不改变规则的情况下避免这个错误?
这些规则阻止所有访问:
".read" : false,
".write" : false,
您可以在 Firebase 数据库规则模拟器工具中轻松测试您的数据库安全规则。
您的规则允许写入的第一个级别在 /users/$uid/fname
。但是您的代码试图写入 /users/$uid
。由于你在那里没有写权限,数据库拒绝写操作。
您有两种选择来解决此问题:允许写入 /users/$uid
,或写入 /users/$uid/fname
。
允许写入 /users/$uid
要允许写入 /users/$uid
,请将您的规则更改为:
"users": {
".read": "auth != null",
"$user_id": {
".write": "auth != null",
"fname": {
".read": "auth != null",
事实上,您可能希望确保用户只能编写他们自己的节点,您可以这样做:
"users": {
".read": "auth != null",
"$user_id": {
".write": "auth.uid === $uid",
"fname": {
".read": "auth != null",
写信给/users/$uid/fname
您当前的写入代码试图写入您没有权限的地方。由于您只写了 fname
,您还可以写入该特定位置以消除错误:
var newUserRef = firebase.database().ref('users/' + user.uid);
newUserRef.child('fname').set(fname);
考虑到数据结构,我可能会修改安全规则。