unicloud云开发进阶10-schema权限规则的变量和运算符

283 阅读3分钟

权限限制

之前cloudDemo数据表对权限的验证只对读给了一个true,创建这一项应该需要验证过

	"permission": {
		"read": true,
		"create": true,
		"update": false,
		"delete": false
	},

文档在unicloud的 DB Schema表结构的数据权限系统里

image.png

权限规则的变量和运算符

除了上述例子提到的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
	},

重新新增一条记录后,登录用户还是同一人 image.png

在浏览器控制台,应用里,把登录信息全部清空测试还能不能新增成功

现在再点新增,在代码中的title和content已经不能提交了,数据库里也确实没有数据 image.png

再次登陆账号,点击新增,就添加成功了,数据库里也有数据了

image.png

image.png

接下来对update进行权限控制

先写一个修改按钮啊,然后通过点击事件对这一个id对应数据进行修改

      // 修改
      goUpdate(){
        db.collection("cloudDemo").doc("2696efc364004516000c7556137ea58f").update({
          title:"uniapp"
        }).then(res=>{
          console.log(res);
        })
      },

现在因为scheam中的update还是false的状态,是不允许修改的,如果直接改成true就能修改成功,但是写true不合理 image.png

通过对用户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);
        })
      },

修改成功了 image.png

在浏览器控制台的应用里,把登录信息全部删掉,就等于是退出登录了

image.png

删除登录信息后,再点击修改就报错了 image.png

这里在控制台报错不合理,通过catch捕获错误,用showtoast在页面中用弹窗提示才对

      // 修改
      goUpdate(){
        db.collection("cloudDemo").doc("2696efc364004516000c7556137ea58f").update({
          title:"微信小程序"
        }).then(res=>{
          console.log(res);
        }).catch(err=>{
          uni.showToast({
            title:err.message,
            icon:'none'
          })
        })
      },

image.png

这里把对数据库的逻辑操作写在页面中是为了测试,一般写在云函数里