uni-app 本地环境下JQL查询云数据库与传统MongoDB写法查询同样数据,传统MongoDB写法出现权限问题而JQL不会
uni-app 本地环境下JQL查询云数据库与传统MongoDB写法查询同样数据,传统MongoDB写法出现权限问题而JQL不会
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
客户端 | ||
云对象 |
示例代码:
//下面写法在客户端调用报错,在云对象中调用不报错
const result = await db
.collection("store")
.aggregate()
.match({ _id: sid.value })
.project({ _id: true })
.end();
//下面写法不报错
const result = await db.collection("store").where({_id:sid.value}).field("_id").get()
操作步骤:
在客户端中使用下面代码会出现权限错误:
const result = await db
.collection("store")
.aggregate()
.match({ _id: sid.value })
.project({ _id: true })
.end();
预期结果:
在客户端中使用下面代码正常获得数据:
const result = await db
.collection("store")
.aggregate()
.match({ _id: sid.value })
.project({ _id: true })
.end();
实际结果:
出现权限错误
bug描述:
同样在本地环境下,使用JQL查询云数据库跟使用传统MongoDB写法查询同样的数据,传统MongoDB写法出现权限问题,而JQL写法不会;且云数据库中没有的read为true
客户端只有JQL语法,也一定会走权限校验。你贴一下store表的权限配置,注意看某个字段上是不是有权限配置
我只查询_id,而它是系动统自生成,没有添加权限配置,而且主要问题是jql语法没有出现权限问题,传统MongoDB写法出现权限问题
回复 1***@163.com: “客户端只有JQL语法”
回复 1***@163.com: 客户端无论你是写uniCloud.database还是uniCloud.databaseForJQL都是jql语法,都会校验权限
在使用 uni-app 开发时,JQL(JSON Query Language)是一种专为 uniCloud 设计的查询语言,它封装了与云数据库的交互逻辑,简化了开发者的操作。JQL 与传统 MongoDB 查询语法类似,但它们在权限控制和执行环境上有一些关键区别,这可能导致在本地环境下使用传统 MongoDB 写法时出现权限问题,而 JQL 不会。
1. 权限控制的区别
-
JQL:JQL 查询在执行时会自动应用 uniCloud 的权限规则。uniCloud 提供了基于角色和权限的访问控制机制,JQL 会根据当前用户的身份(如登录状态、用户角色等)自动过滤数据,确保用户只能访问其有权限的数据。
-
传统 MongoDB 写法:在本地环境下,如果你直接使用 MongoDB 的查询语法,权限控制需要开发者手动实现。如果未正确设置权限规则,可能会导致用户访问到未经授权的数据,从而引发权限问题。
2. 执行环境的区别
-
JQL:JQL 查询是在 uniCloud 的云函数环境中执行的,云函数会自动处理与数据库的连接、权限验证等操作。开发者无需关心底层的数据库连接和权限管理。
-
传统 MongoDB 写法:在本地环境下,如果你直接使用 MongoDB 查询语法,通常需要手动连接到 MongoDB 数据库,并且在查询时可能需要手动处理权限验证。如果权限验证没有正确实现,就会导致权限问题。
3. 如何解决传统 MongoDB 写法中的权限问题
如果你在本地环境下使用传统 MongoDB 写法时遇到权限问题,可以考虑以下解决方案:
- 手动实现权限控制:在查询前,手动检查用户的权限,并根据权限过滤数据。
- 使用 uniCloud 的云函数:将传统的 MongoDB 查询逻辑迁移到 uniCloud 的云函数中,利用 uniCloud 的权限控制机制来管理数据访问。
- 切换到 JQL:如果可能,尽量使用 JQL 进行数据查询,这样可以减少权限管理的复杂性,并确保数据访问的安全性。
4. 示例对比
假设我们有一个 users
集合,我们希望查询当前登录用户的信息。
使用 JQL 查询:
const db = uniCloud.database();
const res = await db.collection('users').where({
_id: uniCloud.getCurrentUserInfo().uid
}).get();
使用传统 MongoDB 查询:
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'your-database';
MongoClient.connect(url, function(err, client) {
if (err) throw err;
const db = client.db(dbName);
const collection = db.collection('users');
collection.find({ _id: 'current-user-id' }).toArray(function(err, docs) {
if (err) throw err;
console.log(docs);
client.close();
});
});