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

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

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 {// 用户拒绝授权}}}

相关文章:

  • 提高 iOS 调试效率的实战经验:日志查看、崩溃分析与性能监控工具推荐(含 KeyMob)
  • 27.第二阶段x64游戏实战-分析技能属性
  • Spring Security与Spring Boot集成原理
  • Oracle 的 PGA_AGGREGATE_LIMIT 参数
  • ElasticSearch 8.x 快速上手并了解核心概念
  • 养生指南:重塑健康生活的实用方案
  • 仿腾讯会议——添加音频
  • MySQL的锁机制
  • 电商后台管理系统:Django Admin深度定制实战指南
  • 蚂蚁数科的AI深潜与RWA远航
  • pinia.defineStore is not a function
  • NeRF适合口腔扫描仪场景吗
  • 深入理解pip:Python包管理的核心工具与实战指南
  • Go语言八股文之Mysql优化
  • 基于 STM32 的自动温度巡检小车控制系统设计与实现
  • ubuntu 安装 Redis新版Redis 7.x
  • vue3 vite 项目中自动导入图片
  • 从零训练一个大模型:DeepSeek 的技术路线与实践
  • windows网站篡改脚本编制
  • 若依框架二次开发——若依微服务整合RocketMQ
  • 4名中学生同服处方药后身体不适,一心堂一药店未凭处方售药被罚1万元
  • 今晚油价下调,加满一箱油将省9元
  • 著名文博专家吴远明因交通事故离世,享年75岁
  • 腾讯一季度净利增14%:AI直接拉动广告收入增长,王者荣耀流水创新高
  • 哪种“网红减肥法”比较靠谱?医学专家和运动专家共同解答
  • 奥迪车加油时频繁“跳枪”维修两年未解决,4S店拒退换:可延长质保