当前位置: 首页 > backend >正文

鸿蒙 系统-安全-程序访问控制-应用权限管控

Ability Kit 提供了一种允许应用访问系统资源(如:通讯录等)和系统能力(如:访问摄像头、麦克风等)的通用权限访问方式,来保护系统数据(包括用户个人数据)或功能,避免它们被不当或恶意使用。

应用权限保护的对象可以分为数据和功能:

  • 数据 包括个人数据(如照片、通讯录、日历、位置等)、设备数据(如设备标识、相机、麦克风等)。
  • 功能 包括设备功能(如访问摄像头/麦克风、打电话、联网等)、应用功能(如弹出悬浮窗、创建快捷方式等)。

系统采用 TokenID 作为应用的唯一标识。权限管理服务通过应用的 TokenID 来管理应用的 AT(Access Token)信息,包括应用身份标识 APP ID、子用户 ID、应用分身索引信息、应用 APL、应用权限授权状态等。在资源使用时,系统将通过 TokenID 作为唯一身份标识映射获取对应应用的权限授权状态信息,并依此进行鉴权,从而管控应用的资源访问行为。
系统支持多用户特性和应用分身特性,同一个应用在不同的子用户下和不同的应用分身下会有各自的 AT,这些 AT 的 TokenID 也是不同的。


授权方式

  • system_grant(系统授权)
    在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。
    如果在应用中申请了 system_grant 权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。配置文件(module.json5)申请权限

  • user_grant(用户授权)
    在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。
    该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。配置文件申请权限 + 运行时弹窗请求授权

常见权限

常见 系统授权 权限

权限描述
ohos.permission.INTERNET允许使用网络资源
ohos.permission.KEEP_BACKGROUND_RUNNING允许 Ability 在后台持续运行
ohos.permission.USE_BLUETOOTH允许应用查看蓝牙的配置
ohos.permission.PRINT允许应用获取打印框架的能力
ohos.permission.ACCELEROMETER允许应用读取加速度传感器的数据
ohos.permission.VIBRATE允许应用控制马达振动

常见 用户授权 权限

权限描述
ohos.permission.APP_TRACKING_CONSENT允许应用读取开放匿名设备标识符
ohos.permission.CAMERA允许应用使用相机
ohos.permission.DISTRIBUTED_DATASYNC允许不同设备间的数据交换
ohos.permission.APPROXIMATELY_LOCATION允许应用获取设备模糊位置信息
ohos.permission.LOCATION允许应用获取设备位置信息
ohos.permission.WRITE_MEDIA允许应用读写用户外部存储中的媒体文件信息

配置文件授权

用在申请权限时,需要在项目的配置文件(module.json5)中,逐个声明需要的权限,否则应用将无法获取授权:

{"module": {"requestPermissions": [{"name": "ohos.permission.PERMISSION_NAME", //所有权限都必须声明权限名称"reason": "$string:reason", //申请原因,user_grant 权限必需"usedScene": {//使用场景,user_grant 权限必需"abilities": ["EntryAbility"], //哪些UIAbility中使用"when": "inuse" //何时使用}}]}
}

向用户申请授权

当应用需要访问用户的隐私信息或使用系统能力时,例如获取位置信息、访问日历、使用相机拍摄照片或录制视频等,应该向用户请求授权,这部分权限是 user_grant 权限。

当应用申请 user_grant 权限时,需要完成以下步骤:

  • 在配置文件(module.json5)中,声明应用需要请求的权限。
  • 将应用中需要申请权限的目标对象与对应目标权限进行关联,让用户明确地知道,哪些操作需要用户向应用授予指定的权限。
  • 运行应用时,在用户触发访问操作目标对象时应该调用接口,精准触发动态授权弹框。该接口的内部会检查当前用户是否已经授权应用所需的权限,如果当前用户尚未授予应用所需的权限,该接口会拉起动态授权弹框,向用户请求授权。
  • 检查用户的授权结果,确认用户已授权才可以进行下一步操作。

每次执行需要目标权限的操作时,应用都必须使用 checkAccessToken()函数检查自己是否已经具有该权限
每次访问受目标权限保护的接口之前,都需要使用 requestPermissionsFromUser()接口请求相应的权限

// 下面的代码可以运行在 Ability 启动时,或者某个 UI页面 启动时
import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit'async checkPermissions() {let permissions: Permissions[] = ["ohos.permission.CAMERA"]let accessMgr = abilityAccessCtrl.createAtManager()const flags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION;const bundleInfo = await bundleManager.getBundleInfoForSelf(flags)const grantStatus =await accessMgr.checkAccessToken(bundleInfo.appInfo.accessTokenId, permissions[0])if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {let results = await accessMgr.requestPermissionsFromUser(getContext(), permissions)if (results.authResults[0] == 0) {// 用户通过授权} else {// 用户拒绝授权}}}
http://www.xdnf.cn/news/7401.html

相关文章:

  • ES6详解
  • Linux中的DNS的安装与配置
  • flow-两种SharingStarted策略的区别示例
  • kotlin Flow的技术范畴
  • 解决软件连接RabbitMQ突发System.IO.IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接异常
  • RabbitMQ-高级
  • nginx 漏洞修复 CVE-2024-7347 CVE-2025-23419
  • 深入理解蒙特卡洛树搜索(MCTS):python从零实现
  • SQL:多列匹配(Multiple-column Matching)
  • Mybatis操作数据库(2)
  • 看之前熟悉双亲委派加载机制,看之后了解双亲委派加载机制
  • HarmonyOS实战:自定义时间选择器
  • 仿微钙化结石体模的详细讲解
  • 学习源码?
  • 详解受约束的强化学习(一、入门学习)
  • 【深度学习新浪潮】什么是多模态大模型?
  • 什么是Monorepo(单体仓库)(monolithic repository)
  • 隨筆 20250519 基于MAUI Blazor整合SQLite数据库与Star打印机的详细步骤
  • 【机器学习】线性回归和损失函数
  • WebSphere Application Server(WAS)8.5.5教程第五讲
  • Python网络爬虫入门指南
  • Git初始化本地已有项目,并推送到远端Git仓库完整操作指南
  • ebpf简介
  • Visual Studio解决方案构建三剑客:生成/重新生成/清理完全指南(实战经验总结)
  • 60天python训练计划----day30
  • GloVe 模型讲解与实战
  • 淘宝商品详情PAI接口可以获取哪些信息?
  • 人工智能重塑医疗健康:从辅助诊断到个性化治疗的全方位变革
  • React 个人笔记 Hooks编程
  • android双屏之副屏待机显示图片