HarmonyOS鸿蒙Next中云数据库的规则如何设置,如何确认"认证用户"并给相应的权限?

HarmonyOS鸿蒙Next中云数据库的规则如何设置,如何确认"认证用户"并给相应的权限? cke_149.png

cke_546.png

查询文档的时候并没有说明云数据库的权限如何配置,有没有总结好的流程?

我自己配置的时候,是采用邮箱认证的,但是我的认证用户未获得相应的权限。


更多关于HarmonyOS鸿蒙Next中云数据库的规则如何设置,如何确认"认证用户"并给相应的权限?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

可以通过getAuthProvider获取当前用户的provider信息,将该信息作为云数据库初始化的入参。

在用户登陆后再初始化一次云服务。

let provider = auth.getAuthProvider(); // 在用户登录成功的情况下调用此方法获取authProvider
cloudCommon.init({authProvider: provider})

更多关于HarmonyOS鸿蒙Next中云数据库的规则如何设置,如何确认"认证用户"并给相应的权限?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


大佬,我按你的方法,解决了认证用户没有权限的问题了,现在还有一个问题,就是云数据库怎么知道我是数据创建人还是管理员,还是普通认证用户,我如果改成数据创建人和管理员才有权限时,现在我的数据没有权限操作了,

可以了,原来是要之后的新增才有效,我新增测试OK,

  1. 这个权限是创建对象类型(就是建数据库表)的时候设置的,第一次建表会建个库。
    认证用户是四种角色中的一种。
    看这个《创建第一个数据库》里面的第8步,可以配置你的第2个截图。
    cke_9881.png

  2. 安全规则是帮你做对用户身份验证的,验证通过的用户可以获得数据库表的数据资源访问的权限。
    建表后点 规则 标签,就可以修改规则了。参考《编写或修改安全规则》

你这个问题,其实可以简单理解成:

CloudDB 的“认证用户”
就是“已经登录 AGC 账号的用户”

不是:

你数据库里有邮箱

也不是:

你自己业务系统里的用户

很多人都会误会这里。


比如:

你现在做了:

  • 邮箱注册
  • 邮箱登录
  • 华为账号登录

但如果:

AGC Auth 没真正登录成功

那 CloudDB 还是认为你:

未认证

所以权限不会生效。


你现在这个规则:

allow read, write: if true;

其实已经是:

任何人都能读写

连游客都行。

所以如果还报权限问题:

那大概率不是规则问题。

而是:

用户根本没登录成功

或者:

CloudDB 初始化早于登录

最常见错误:

错误流程

App启动
→ openCloudDBZone()
→ 用户登录

这样不行。

因为:

CloudDB 打开时
就已经绑定当前 token 了

这时候用户还没登录。

所以:

CloudDB 里没有认证状态

正确流程:

正确流程

App启动
→ 用户登录
→ 获取 currentUser
→ openCloudDBZone()
→ query/upsert

顺序不能反。


你可以打印一下:

const user = AGConnectAuth.getInstance().currentUser;
console.log(user);

如果:

user == null

那说明:

虽然你做了登录UI
但 AGC 实际没登录成功

还有一点:

你说:

用了邮箱认证

这里只是:

开启了邮箱登录能力

不代表:

当前用户已经登录

这俩不是一回事。


再通俗点:

CloudDB 权限判断逻辑

CloudDB 不看:

你有没有邮箱

它只看:

当前有没有 AGC 登录态

有:

认证用户

没有:

游客

就这么简单。


推荐你先这样测试:

第一阶段(先排除问题)

规则直接:

allow read, write: if true;

然后:

只检查:

currentUser 是否为空

第二阶段(正式环境)

改成:

allow read, write: if request.auth != null;

意思:

必须登录后才能访问数据库

还有个重点:

CloudDB 本身依赖 Auth Service。

官方其实有一句话提过:

Cloud DB service depends on Auth Service

但文档确实没讲透。

云数据库权限不是在客户端代码里单独判断“邮箱用户”,而是在 AGC 云数据库的对象类型权限里配置角色。

建议按这个流程排查:先确认邮箱认证是在同一个 AGC 项目/应用下完成的,客户端完成登录后再打开 Cloud DB;然后到“云开发 > 云数据库 > 对象类型”里给目标对象类型配置权限。“认证用户”表示经过 AGC 登录认证的用户,可以按业务勾选 query/upsert/delete;如果只允许用户改自己的数据,用“数据创建者”角色更合适;“所有人”一般不要给写入和删除权限。

配置完对象类型权限后,记得重新导出 schema.json 并放回工程,保证客户端对象类型和云端一致。

如果邮箱登录后仍提示无权限,重点看这几项:登录和云数据库是否属于同一个项目;操作的对象类型/存储区是不是你配置过权限的那个;是否把权限配给了“数据创建者”但当前数据不是该用户创建;对象类型里是否开启了加密字段;以及本地 schema.json 是否没有同步云端最新配置。

帮顶

编写安全规则吗,看看这个文档https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-clouddb-security-rules-get-started-0000001146621848#section1999910142414,

在HarmonyOS NEXT中,云数据库规则通过AGC控制台“云数据库”->“数据权限”配置。使用auth变量确认认证用户,例如auth.uid != null表示已登录用户。权限通过JSON规则定义,如"read": "auth.uid != null"允许认证用户读取,"write": "auth.uid == resource.auth.uid"限制写入本人数据。支持复合条件及正则校验。

云数据库的权限通过安全规则控制,而非直接在库表配置。规则中使用 request.auth 判断认证用户:

  • auth.uid:当前登录用户的 UID(认证后返回的用户标识)。
  • 例:{"read":"auth.uid != null"}(仅有认证用户可读),
    {"write":"auth.uid == resource.data.owner"}(仅数据所有者可写)。

确认认证用户的关键:

  1. 使用邮箱认证时,必须调用 cloud.auth().signIn(provider) 完成登录,获取 auth.uid
  2. 后续云数据库请求会自动携带认证凭证,服务器依据 auth.uid 匹配规则。

未获权限的常见原因:

  • 未在云数据库控制台开启权限管理,仍处“开发模式”。
  • 登录后未重新生成或刷新 token,导致 auth.uid 为 null。
  • 规则中比较的资源字段(如 resource.data.uid)与数据结构不匹配。

配置流程概要:

  1. 云数据库控制台 → 选择表 → 开启“安全规则”。
  2. 编写 JSON 规则(如基于 auth.uid 的读写条件)。
  3. 客户端用邮箱认证并确保登录成功(监听 auth.on('loginStateChanged'))。
  4. 调用云数据库操作,系统自动校验权限。
回到顶部