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

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)中,逐个声明需要的权限,否则应用将无法获取授权:

json 复制代码
{
  "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()接口请求相应的权限

ts 复制代码
// 下面的代码可以运行在 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 {
        // 用户拒绝授权
      }
    }
  }
相关推荐
__Benco3 小时前
OpenHarmony外设驱动使用 (四),Face_auth
人工智能·驱动开发·计算机视觉·harmonyos
IT小码哥丶4 小时前
HarmonyOS实战:快速实现一个上下滚动的广告控件
华为·harmonyos
幽蓝计划6 小时前
Uniapp开发鸿蒙应用时如何运行和调试项目
华为·uni-app·harmonyos
魔术师ID13 小时前
HarmonyOS开发组件基础
华为·harmonyos
周胡杰17 小时前
组件导航 (Navigation)+flutter项目搭建-混合开发+分栏
数码相机·flutter·华为·电脑·harmonyos·鸿蒙
特立独行的猫a1 天前
HarmonyOS 影视应用APP开发--配套的后台服务go-imovie项目介绍及使用
华为·golang·harmonyos·影视app
梁下轻语的秋缘1 天前
HarmonyOS:重构万物互联时代的操作系统范式
华为·重构·harmonyos
lpfasd1231 天前
Flutter与Kotlin Multiplatform(KMP)深度对比及鸿蒙生态适配解析
flutter·kotlin·harmonyos
交叉编译之王 hahaha1 天前
OpenHarmony 5.1.0 Release目录结构详细解析(3级目录)
arm开发·华为·harmonyos