权限限制
之前cloudDemo
数据表对权限的验证只对读给了一个true,创建这一项应该需要验证过
"permission": {
"read": true,
"create": true,
"update": false,
"delete": false
},
文档在unicloud的 DB Schema表结构的数据权限系统里
权限规则的变量和运算符
除了上述例子提到的doc变量,事实上DB Schema
的权限规则支持很多变量和运算符,可以满足各种配置需求。
权限规则内可用的全局变量
变量名 | 说明 |
---|---|
auth.uid | 用户id |
auth.role | 用户角色数组,参考uni-id 角色权限,注意admin 为内置的角色,如果用户角色列表里包含admin 则认为此用户有完全数据访问权限 |
auth.permission | 用户权限数组,参考uni-id 角色权限 |
doc | 数据库中的目标数据记录,用于匹配记录内容/查询条件 |
now | 当前服务器时间戳(单位:毫秒),时间戳可以进行额外运算,如doc.publish_date > now - 60000表示publish_date在最近一分钟 |
action | 数据操作请求同时指定的uni-clientDB-action。用于指定前端的数据操作必须同时附带执行一个action云函数,如未触发该action则权限验证失败 |
auth.uid
用于读取当前登录的用户身份,第二条用于读取角色,第三条读取权限,doc代表数据库表名字
基于以上的这几条,在cloudDemo的schema中,对创建这一条的验证规则需要用户id不为空:
"bsonType": "object",
"required": ["title"],
"permission": {
"read": true,
"create": "auth.uid != null",
"update": false,
"delete": false
},
重新新增一条记录后,登录用户还是同一人
在浏览器控制台,应用里,把登录信息全部清空测试还能不能新增成功
现在再点新增,在代码中的title和content已经不能提交了,数据库里也确实没有数据
再次登陆账号,点击新增,就添加成功了,数据库里也有数据了
接下来对update进行权限控制
先写一个修改按钮啊,然后通过点击事件对这一个id对应数据进行修改
// 修改
goUpdate(){
db.collection("cloudDemo").doc("2696efc364004516000c7556137ea58f").update({
title:"uniapp"
}).then(res=>{
console.log(res);
})
},
现在因为scheam中的update还是false的状态,是不允许修改的,如果直接改成true就能修改成功,但是写true不合理
通过对用户id进行限制 这里是通过判断数据表里保存的用户id和当前登录用户的id是否相等来验证的,我猜意思应该是判断当前用户是否登录 doc表示当前这张表的表名
{
"bsonType": "object",
"required": ["title"],
"permission": {
"read": true,
"create": "auth.uid != null",
"update": "doc.userid == auth.uid",
"delete": false
},
把修改的值设置成微信小程序
// 修改
goUpdate(){
db.collection("cloudDemo").doc("2696efc364004516000c7556137ea58f").update({
title:"微信小程序"
}).then(res=>{
console.log(res);
})
},
修改成功了
在浏览器控制台的应用里,把登录信息全部删掉,就等于是退出登录了
删除登录信息后,再点击修改就报错了
这里在控制台报错不合理,通过catch捕获错误,用showtoast在页面中用弹窗提示才对
// 修改
goUpdate(){
db.collection("cloudDemo").doc("2696efc364004516000c7556137ea58f").update({
title:"微信小程序"
}).then(res=>{
console.log(res);
}).catch(err=>{
uni.showToast({
title:err.message,
icon:'none'
})
})
},
这里把对数据库的逻辑操作写在页面中是为了测试,一般写在云函数里