苦于学习小程序开发时找不到多少有用的博客教程,网上看过很多博客,不是只有几行一笔带过,就是互相都是复制粘贴,甚至全篇复制微信官方文档。所以我要把我踩过的坑都记下来,方便自己总结归纳也方便其他人交流学习。
本篇博客是另一篇实战项目博客的拓展,将其中踩过的坑单独拿出来做个总结。有兴趣可以去看看那篇:
先来看看官方对于云开发数据库中权限管理的描述:
每个集合可以拥有一种权限配置,权限配置的规则是作用在集合的每个记录上的。出于易用性和安全性的考虑,云开发为云数据库做了小程序深度整合,在小程序中创建的每个数据库记录都会带有该记录创建者(即小程序用户)的信息,以 _openid 字段保存用户的 openid 在每个相应用户创建的记录中。因此,权限控制也相应围绕着一个用户是否应该拥有权限操作其他用户创建的数据展开。
以下按照权限级别从宽到紧排列如下:
仅创建者可写,所有人可读:数据只有创建者可写、所有人可读;比如文章。
仅创建者可读写:数据只有创建者可读写,其他用户不可读写;比如用私密相册。
仅管理端可写,所有人可读:该数据只有管理端可写,所有人可读;如商品信息。
仅管理端可读写:该数据只有管理端可读写;如后台用的不暴露的数据。
打开云开发控制台,数据库中对每个集合都有个权限设置:
对于像留言板内容的集合,我自然是要让所有用户都可读,不然一个用户就没法看到其他人的留言了。
这里的仅创建者可写的创建者,是指创建这个集合元素的人,比如 A 添加了一条留言,这条留言就是这个集合里的一条元素记录,这条记录会带上记录这个 A 的 _openid
(唯一身份标识)字段,然后这条记录只有A能修改。
很显然这种权限分级对于我这个留言板是不够的,我作为管理员,需要回复其他人的留言,并可以进行置顶删除操作,这些都要修改这条记录的内容。
如果我想回复 A,直接在页面的 js 文件中修改 A 创建的这条记录,调用数据库的 update 方法:
db.collection('message').doc('replyMsgId').update({
// data 传入需要局部更新的数据
data: {
// 表示将 reply 字段置为回复内容
reply: "这是一条回复"
},
success: function(res) {
console.log(res.data)
}
})
那么这条更新是不起作用的。
原因就是,你没有权限修改其他人创建的内容。
这就是云开发数据库的权限限制了。
如何解决这个问题?
很简单,使用云函数。
我在 js 文件中调用 reply 这个云函数并把回复内容和要回复的留言记录的 id 传入。通过云函数来 update 数据库,这样就不会有权限问题了。
wx.cloud.callFunction({
name: 'reply',
data: {
id: this.data.replyMsgId,
reply: e.detail.value.msgInput,
}
}).then(res => {
wx.showToast({
title: "回复成功",
icon: "success",
success: res2 => {
this.setData({
textValue: ""
});
this.getData();
}
});
})
reply 云函数如下:
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const _ = db.command
exports.main = async (event, context) => {
try {
return await db.collection('message').doc(event.id).update({
data: {
reply:event.reply
},
})
} catch (e) {
console.error(e)
}
}
现在只要你在小程序中配置好管理员权限,你就可以通过云函数修改其他人创建的记录了。