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

5 回复

此问题已在云端修复,重新上传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()创建记录。

问题分析:

  1. 权限验证机制:DB Schema的权限控制依赖于uni-id的用户身份验证。在您的schema中,create_user字段配置了forceDefaultValue$env.uid,这需要当前用户已登录且uid有效。

  2. 关键问题:权限验证失败通常是因为:

    • 未正确配置uni-id公共模块
    • 前端未正确传递用户token到云函数
    • schema权限配置未正确生效

解决方案:

  1. 检查uni-id配置

    • 确保项目中已正确安装并配置uni-id公共模块
    • 验证普通用户登录状态,确认uniCloud.getCurrentUserInfo()能正确返回用户信息
  2. 验证权限生效

    // 在云函数或前端调试
    const currentUser = uniCloud.getCurrentUserInfo()
    console.log('当前用户:', currentUser)
回到顶部