uni-app DB Schema 表级权限控制的 "create"权限失效
uni-app DB Schema 表级权限控制的 "create"权限失效
示例代码:
{
"bsonType": "object",
"required": [],
"permission": {
"read": true,
"create": false,
"update": false,
"delete": false
},
"properties": {
"_id": {
"description": "ID,系统自动生成"
},
"title": {
"bsonType": "string",
"description": "文章题目",
"title": "文章题目"
},
"content": {
"bsonType": "string",
"description": "文章内容",
"title": "文章内容"
},
"create_user": {
"bsonType": "string",
"foreignKey": "uni-id-users._id",
"description": "新建该计划的用户ID",
"forceDefaultValue": {
"$env": "uid"
}
}
}
}
前端代码(使用schema2code生成)
<template>
<view class="uni-container">
<uni-forms ref="form" :value="formData" validate-trigger="submit" err-show-type="toast">
<uni-forms-item name="title" label="文章题目">
<uni-easyinput placeholder="文章题目" v-model="formData.title"></uni-easyinput>
</uni-forms-item>
<uni-forms-item name="content" label="文章内容">
<uni-easyinput placeholder="文章内容" v-model="formData.content"></uni-easyinput>
</uni-forms-item>
<view class="uni-button-group">
<button type="primary" class="uni-button" @click="submit">提交</button>
</view>
</uni-forms>
</view>
</template>
<script>
import { validator } from '../../js_sdk/validator/admin-article-test.js';
const db = uniCloud.database();
const dbCollectionName = 'admin-article-test';
function getValidator(fields) {
let result = {}
for (let key in validator) {
if (fields.indexOf(key) > -1) {
result[key] = validator[key]
}
}
return result
}
export default {
data() {
let formData = {
"title": "",
"content": ""
}
return {
formData,
formOptions: {},
rules: {
...getValidator(Object.keys(formData))
}
}
},
onReady() {
this.$refs.form.setRules(this.rules)
},
methods: {
/**
* 触发表单提交
*/
submit() {
uni.showLoading({
mask: true
})
this.$refs.form.validate().then((res) => {
this.submitForm(res)
}).catch(() => {
uni.hideLoading()
})
},
submitForm(value) {
// 使用 clientDB 提交数据
db.collection(dbCollectionName).add(value).then((res) => {
uni.showToast({
icon: 'none',
title: '新增成功'
})
this.getOpenerEventChannel().emit('refreshData')
setTimeout(() => uni.navigateBack(), 500)
}).catch((err) => {
uni.showModal({
content: err.message || '请求服务失败',
showCancel: false
})
}).finally(() => {
uni.hideLoading()
})
}
}
}
</script>
操作步骤:
使用uni-admin结合schema2code生成页面,正确保存.schema.json文件并成功上传数据集合Schema。 给普通用户 read 权限但前端界面保留添加记录的功能,前端使用普通用户登录,创建数据记录。代码见附件。
预期结果:
预期浏览器控制台应该输出错误,提示权限校验失败
实际结果:
实际程序可以允许,并且可以给数据库添加数据记录,权限校验没有起作用。
bug描述:
schema 表级权限中配置 create 权限为 false 或者不配置该权限时,使用非 admin 普通用户登录后,前端仍然可以通过db.collection(***).add(***)创建记录。(已正确保存文件并成功上传数据集合Schema,在 unicloud web控制台也可以看到修改,但是确实无法控制普通用户创建数据)
重新用一个demo复现了这个bug,项目文件见附件。
更多关于uni-app DB Schema 表级权限控制的 "create"权限失效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
此问题已在云端修复,重新上传schema可以看到效果
更多关于uni-app DB Schema 表级权限控制的 "create"权限失效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
现在的权限限制又过于强了,false的时候连admin用户都创建不了,只能把false随便改成一个 xxx in auth.permission,这样admin用户才能创建
回复 8***@qq.com: 了解,我们调整下
回复 8***@qq.com: 感谢你的反馈,此问题已修复
根据您提供的代码和描述,这是一个典型的uni-app DB Schema权限控制问题。表级权限配置中"create": false未生效,普通用户仍能通过db.collection().add()创建记录。
问题分析:
-
权限验证机制:DB Schema的权限控制依赖于
uni-id的用户身份验证。在您的schema中,create_user字段配置了forceDefaultValue为$env.uid,这需要当前用户已登录且uid有效。 -
关键问题:权限验证失败通常是因为:
- 未正确配置
uni-id公共模块 - 前端未正确传递用户token到云函数
- schema权限配置未正确生效
- 未正确配置
解决方案:
-
检查uni-id配置:
- 确保项目中已正确安装并配置
uni-id公共模块 - 验证普通用户登录状态,确认
uniCloud.getCurrentUserInfo()能正确返回用户信息
- 确保项目中已正确安装并配置
-
验证权限生效:
// 在云函数或前端调试 const currentUser = uniCloud.getCurrentUserInfo() console.log('当前用户:', currentUser)

