uni-app unicloud联表查询uni-id-users时不要求读取password但总是报错 提示[uni-id-users.password.read]权限校验未通过
uni-app unicloud联表查询uni-id-users时不要求读取password但总是报错 提示[uni-id-users.password.read]权限校验未通过
示例代码:
const comments1 = db.collection('opendb-news-comments').where("article_id=='"+this.articleId+"'")
.field("_id,like_count,user_id,comment_content,reply_comment_id,comment_date")
.getTemp();
const comments3 = db.collection('love').where({
userid:this.userInfo._id
}).field("objectid,userid").getTemp();
const res = await db.collection(comments1, comments3,'uni-id-users')
.field("_id,like_count,user_id{nickname,avatar,avatar_file},comment_content,reply_comment_id,comment_date")
.get()
console.log("comment:",res.result.data); // 打印数据
=========================================
love.schema.json
=========================================
// 文档教程: https://uniapp.dcloud.net.cn/uniCloud/schema
{
"bsonType": "object",
"required": [],
"permission": {
"read": true,
"create": false,
"update": false,
"delete": false
},
"properties": {
"_id": {
"description": "ID,系统自动生成"
},
"objectid": {
"bsonType": "string",
"description": "被赞的评论ID",
"foreignKey": "opendb-news-comments._id"
},
"userid": {
"bsonType": "string",
"description": "点赞的用户ID",
"foreignKey": "uni-id-users._id"
}
}
}
操作步骤:
- 执行三条联表查询语句(两条
getTemp
,一条get
)
预期结果:
- 正常联表查询记录(不含password等字段)
实际结果:
- 报错:PERMISSION_ERROR [uni-id-users.password.read]权限校验未通过
bug描述:
目标:基于opendb-news-comments
默认的评论数据库,
(1)查询某篇文章的所有评论
(2)联表自建的love
数据库查询点赞用户为自己的记录
(3)联表uni-id-users
数据库查询评论者的昵称、头像信息
代码及自建love
数据库schema
文件详见代码示例部分。
问题:最后一步联表查询时,明明已经用field()
过滤了uni-id-users
表的password
字段,但总是报错:PERMISSION_ERROR [uni-id-users.password.read]权限校验未通过。
更多关于uni-app unicloud联表查询uni-id-users时不要求读取password但总是报错 提示[uni-id-users.password.read]权限校验未通过的实战教程也可以访问 https://www.itying.com/category-93-b0.html
给uni-id-users也准备一个临时表,在临时表内过滤字段,参考此文档的权限校验章节:https://doc.dcloud.net.cn/uniCloud/jql.html#lookup-with-temp
更多关于uni-app unicloud联表查询uni-id-users时不要求读取password但总是报错 提示[uni-id-users.password.read]权限校验未通过的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在 UniCloud 中进行联表查询时,如果你不想读取 uni-id-users
表中的 password
字段,但仍然遇到 [uni-id-users.password.read]权限校验未通过
的错误,可能是因为 UniCloud 的安全机制默认会检查所有字段的权限,即使你在查询中没有显式地选择该字段。
要解决这个问题,你可以尝试以下几种方法:
1. 明确排除 password
字段
在查询时明确排除 password
字段,确保不会触发权限检查。例如:
const db = uniCloud.database();
db.collection('uni-id-users').field('_id,username,email').get();
这样,查询中只包含了 _id
、username
和 email
字段,不会涉及到 password
字段的权限检查。
2. 调整数据库权限
如果你有权限管理数据库的权限设置,可以调整 uni-id-users
表的权限,允许读取 password
字段。不过,这通常是 不推荐 的,因为 password
是敏感信息,不应该被随意读取。
如果你确实需要调整权限,可以在 uniCloud
控制台的数据库权限设置中进行修改。
3. 使用自定义权限
如果你需要更细粒度的权限控制,可以考虑使用 UniCloud 的自定义权限功能。你可以在 schema
中为 password
字段设置特定的读取权限。
例如,在 uni-id-users
表的 schema
中,可以这样设置:
{
"bsonType": "object",
"required": [],
"properties": {
"password": {
"bsonType": "string",
"readOnly": true, // 设置为只读,防止被误操作
"permission": {
"read": "false" // 禁止读取
}
},
"username": {
"bsonType": "string"
},
"email": {
"bsonType": "string"
}
}
}
这样,即使查询中不小心包含了 password
字段,也不会触发权限错误。
4. 检查联表查询的字段
如果你在联表查询中使用了 uni-id-users
表,确保在联表查询的 field
方法中明确排除 password
字段。例如:
const db = uniCloud.database();
db.collection('order')
.field('_id,user_id,order_no')
.get()
.then(res => {
console.log(res);
});
在联表查询时,确保不会涉及到 password
字段。
5. 使用 uni-id
提供的 API
如果你需要获取用户信息,建议使用 uni-id
提供的 API,而不是直接查询 uni-id-users
表。例如,使用 uni-id
的 getUserInfo
方法来获取用户信息,这样可以避免直接操作数据库和权限问题。
const uniID = require('uni-id');
uniID.getUserInfo({
uid: 'user_id'
}).then(res => {
console.log(res);
});