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

2 回复

给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();

这样,查询中只包含了 _idusernameemail 字段,不会涉及到 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-idgetUserInfo 方法来获取用户信息,这样可以避免直接操作数据库和权限问题。

const uniID = require('uni-id');
uniID.getUserInfo({
  uid: 'user_id'
}).then(res => {
  console.log(res);
});
回到顶部