如何解决Back4App原生JS操作User表出现的206权限不足错误?
206 Insufficient Auth 报错修复方案
错误原因
Back4App基于Parse Server开发,206 Insufficient Auth 是权限类报错,Parse默认_User用户表的权限规则为:仅用户本人可修改自身的用户数据,未登录身份、其他登录用户均没有权限修改不属于自己的用户对象。你当前代码中是查询符合条件的用户直接修改,操作身份没有对应权限就会触发该报错。
修复方案
方案1:仅修改当前登录用户自身信息(最安全的常规业务方案)
如果你的业务需求是用户修改自己的classname属性,不需要查询其他用户,直接调用Parse.User.current()获取当前登录的用户对象操作即可,符合默认权限规则:
function updateMyClassName() { const currentUser = Parse.User.current(); // 先判断用户是否登录 if (!currentUser) { console.log("请先登录"); return; } const updateTo = document.getElementById("s-className").value; currentUser.set('classname', updateTo); currentUser.save().then(function(user) { console.log(user.get("classname")); }).catch(function(error) { console.log(error.code + " " + error.message); }); }
方案2:需要修改其他用户属性(适用于管理员操作类场景)
如果业务确实需要修改其他用户的属性,不要在前端直接操作,避免暴露敏感权限,推荐使用Back4App云函数实现:
- 首先在Back4App后台编写云函数,云函数中可以使用主密钥绕过权限校验:
// 云函数代码,部署在Back4App后台 Parse.Cloud.define("updateUserClassName", async (request) => { const { userId, newClassName } = request.params; // 可以在这里加身份校验,比如判断操作人是不是管理员,避免滥用 const query = new Parse.Query(Parse.User); const targetUser = await query.get(userId); targetUser.set("classname", newClassName); // 传useMasterKey参数绕过权限限制 await targetUser.save(null, { useMasterKey: true }); return targetUser.get("classname"); });
- 前端调用云函数完成修改:
// 前端原逻辑调整,查询到用户后调用云函数 function read() { const User = Parse.Object.extend('User'); const query = new Parse.Query(User); // 注意:你原代码里的'undefined'是字符串,如果要查字段未赋值的用户,改用query.doesNotExist("classname") query.doesNotExist("classname"); query.first().then(async function(user) { if(user) { console.log(user.get("username")); // 调用云函数 const result = await Parse.Cloud.run("updateUserClassName", { userId: user.id, newClassName: document.getElementById("s-className").value }); console.log("修改成功", result); } else { console.log("Nothing found..."); } }).catch(err => { console.log(err.code + " " + err.message); }) }
不推荐的临时测试方案
仅本地测试时可以使用,绝对不要在线上环境使用:
- 方式1:在Back4App后台
_User表的「Class Level Permissions」配置中,给Public开放Write权限,会导致所有用户都能修改任意用户信息,安全风险极高。 - 方式2:前端save时传入主密钥,主密钥会直接暴露在前端代码中,可能被人窃取后删库、篡改所有数据。
内容的提问来源于stack exchange,提问作者AyE
相关产品推荐
相关产品推荐

