
摘要
随着鸿蒙系统分布式能力的不断完善,多设备协同已经不再是概念层面的东西,而是真正落地到手机、平板、手表、车机和 IoT 设备的日常使用中。
但设备一多,问题也随之而来:设备之间到底能不能互相访问?权限怎么管?会不会被滥用?
传统操作系统里的权限模型,大多只关注"某个应用能不能用某个能力",但在鸿蒙这种多设备协同的场景下,这种模型已经不够用了。
鸿蒙给出的答案是:分布式权限管理架构。
这篇文章会结合架构设计、实际开发流程以及几个真实场景的 Demo,聊一聊鸿蒙系统里分布式权限到底是怎么工作的,以及我们在开发中应该怎么用。
引言
在实际开发中,你可能会遇到这些场景:
- 手机调用手表上的传感器数据
- 平板控制电视播放内容
- 手机和车机之间同步导航、联系人
- 智能家居设备之间联动执行操作
这些场景的共同点是:
能力不在当前设备上,而在另一台设备上。
如果没有一套可靠的权限和安全机制,就很容易出现越权访问、数据泄露,甚至中间人攻击等问题。
鸿蒙从系统层面引入了分布式权限管理,把权限控制从"单设备"升级到了"多设备协同"。
什么是鸿蒙的分布式权限管理
从"本地权限"到"分布式权限"
在传统系统里,权限的核心问题只有一个:
这个应用能不能用这个能力?
但在鸿蒙里,问题变成了三个:
- 这个应用是谁
- 它现在在哪个设备上
- 要访问的是不是另一台可信设备上的能力
也就是说,权限不再只属于应用,而是和设备、场景绑定在一起的。
整体架构是怎么分层的
从开发者视角看,鸿蒙的分布式权限大致可以理解为"四层结构":
- 应用层:我们写的 ArkTS / Java 应用
- 权限框架层:负责校验、授权判断
- 分布式安全能力层:设备认证、可信关系
- 分布式权限中心:系统服务,真正做决策的地方
简单理解就是:
你发起调用,系统层层检查,只要有一步不通过,调用直接失败。
分布式权限的核心设计思路
权限 = 应用 + 设备 + 场景
在分布式场景下,一个权限是否有效,取决于三件事:
- 应用有没有声明这个权限
- 当前设备有没有被授权
- 目标设备是不是可信设备
比如:
同一个应用,在你自己的手表上可以用某个能力,但在陌生设备上就不一定能用。
本地校验和远端校验都会发生
这是很多初学者容易忽略的一点。
分布式调用时,系统会同时做两次检查:
- 本地设备:你有没有这个权限
- 远端设备:你能不能访问它的能力
任何一端拒绝,调用都会失败。
默认是最小权限和临时授权
鸿蒙在分布式场景下,更偏向:
- 一次性授权
- 按能力授权
- 授权可以随时撤销
这点在 IoT 和多设备协同中非常重要,可以避免权限长期滥用。
分布式权限的完整工作流程
以手机调用手表的数据能力为例,整个流程大致是这样:
- 应用发起分布式调用
- 系统检查 module.json5 是否声明权限
- 检查运行时是否已授权
- 校验设备是否处于同一可信域
- 分布式权限中心生成临时授权信息
- 远端设备再次校验权限
- 决定是否允许访问
从开发者角度看,你只写了一次调用代码,但背后系统已经帮你做了很多安全工作。
基础 Demo:分布式权限申请与校验
在 module.json5 中声明权限
这是所有分布式能力的第一步,如果这里没声明,后面都会失败。
json5
{
"module": {
"reqPermissions": [
{
"name": "ohos.permission.DISTRIBUTED_DATASYNC",
"reason": "用于跨设备数据同步"
}
]
}
}
运行时请求权限(ArkTS)
ts
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
const atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(
getContext(),
['ohos.permission.DISTRIBUTED_DATASYNC']
).then(result => {
if (result.authResults[0] === 0) {
console.info('分布式权限授权成功');
} else {
console.warn('分布式权限被拒绝');
}
});
这一步和普通敏感权限的使用方式非常接近,开发成本并不高。
调用前进行权限校验
ts
let status = atManager.checkAccessToken(
getContext().applicationInfo.accessTokenId,
'ohos.permission.DISTRIBUTED_DATASYNC'
);
if (status === abilityAccessCtrl.PermissionStatus.PERMISSION_GRANTED) {
// 执行分布式调用
} else {
console.error('没有分布式权限,终止调用');
}
在真实项目中,建议每次分布式调用前都做一次检查,避免异常。
实际应用场景分析与示例
场景一:手机与手表同步运动数据
场景说明
- 手表负责采集心率、步数
- 手机负责展示和分析数据
- 手机通过分布式能力获取手表数据
示例代码(简化)
ts
function syncSportData() {
if (!hasDistributedPermission()) {
console.warn('无分布式权限');
return;
}
console.info('开始同步手表运动数据');
}
代码说明
- 权限校验放在业务逻辑最前面
- 避免在无权限情况下触发设备通信
- 有利于降低异常率和功耗
场景二:平板控制电视播放内容
场景说明
- 平板作为控制端
- 电视作为能力提供端
- 需要校验设备是否属于同一账号
示例代码
ts
function controlTvPlay() {
if (!hasDistributedPermission()) {
console.error('当前设备无权控制电视');
return;
}
console.info('发送播放指令到电视');
}
代码说明
这里的权限不仅控制"能不能调用",也间接控制了"是不是你的设备"。
场景三:智能家居设备联动
场景说明
- 手机作为统一控制入口
- 多个 IoT 设备参与协同
- 权限可随时撤销,避免长期授权风险
示例代码
ts
function triggerSmartHome() {
console.info('检查分布式权限并触发家居联动');
}
在这种场景下,分布式权限的"临时授权"特性就非常重要。
常见问题 QA
Q1:分布式权限和普通权限有什么本质区别?
普通权限只关心当前设备,分布式权限同时关心本地和远端设备。
Q2:开发者需要自己管理设备可信关系吗?
不需要,系统已经在底层做了设备认证和可信关系维护。
Q3:分布式权限会影响性能吗?
有一定开销,但都在系统层完成,对应用影响很小,安全收益远大于成本。
总结
鸿蒙的分布式权限管理,本质上是为多设备协同场景量身定做的一套安全机制。
它把权限从"应用维度"升级到了"应用 + 设备 + 场景",让跨设备调用变得可控、可管、可撤销。
在实际开发中,只要遵循:
- 声明权限
- 运行时授权
- 调用前校验
这三步,就可以在保证安全的前提下,放心使用鸿蒙的分布式能力。