积分582 / 贡献0

提问0答案被采纳0文章52

[经验分享] OpenHarmony应用权限管理 原创 精华

Laval社区小助手 显示全部楼层 发表于 2024-6-5 15:59:50

基本概念

默认情况下,应用只能访问有限的系统资源。但某些情况下,应用为了扩展功能的诉求,需要访问额外的系统或其他应用的数据(包括用户个人数据)、功能。系统或应用也必须以明确的方式对外提供接口来共享其数据或功能。OpenHarmony提供了一种访问控制机制来保证这些数据或功能不会被不当或恶意使用,即应用权限。

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

  • 数据包含了个人数据(如照片、通讯录、日历、位置等)、设备数据(如设备标识、相机、麦克风等)、应用数据。
  • 功能则包括了设备功能(如打电话、发短信、联网等)、应用功能(如弹出悬浮框、创建快捷方式等)等。

应用权限是程序访问操作某种对象的通行证。权限在应用层面要求有明确定义,应用权限使得系统可以规范各类应用程序的行为准则,实现用户隐私的保护机制。当应用访问操作目标对象时,目标对象会对应用进行权限检查,如果没有对应权限,则访问操作将被拒绝。

例如调用蓝牙相关接口,未申请蓝牙相关权限调用相关权限受限接口系统会提示 "check permission failed" :

未申请蓝牙相关权限

权限的工作流程

在使用相关接口或者数据的时候,会评估该行为是否需要应用具备相关的权限。如果确认需要目标权限,则需要在应用安装包中申请目标权限。

然后,需要判断目标权限是否属于用户授权类。如果是,应用需要使用动态授权弹框来提供用户授权界面,请求用户授权目标权限。

应用使用权限的工作流程如图所示。

权限工作流程

权限的授权方式

权限的授权方式可分为system_grant(系统授权)和user_grant(用户授权)。

系统授权(system_grant)

如果应用申请了system_grant权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。

在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作不会对系统或者其他应用产生大的不利影响。

目标权限的授权方式是系统授权(system_grant)时,需要在**config.json(FA 模型)或者module.json5(Stage 模型)**文件中声明目标权限,系统会在安装应用时为其进行权限预授予。其中name属性必填,其余非必填。

{
  "module" : {
    // "requesetPermissions":[] Stage 模型
    // "reqPermissions":[] FA 模型
    "reqPermissions":[
      { "name" : "ohos.permission.PERMISSION1" },
      {
        "name" : "ohos.permission.PERMISSION2",
        "reason": "$string:reason",
        "usedScene": {
          "abilities": [
            "FormAbility"
          ],
          "when":"always"
        }
      }
    ],
  }
}

用户授权(user_grant)

如果应用申请了user_grant权限,且该权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。

在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。

目标权限的授权方式是用户授权(user_grant)时,请完成以下步骤:

  1. 在**config.json(FA 模型)或者module.json5(Stage 模型)**文件文件中,声明应用需要请求的权限,此步骤与系统授权一致。

  2. 在开发中需要使用代码来调用用户手动授权操作,FA模型与Stage模型有细微区别,参考如下:

    • FA模型手动授权
    import featureAbility from '@ohos.ability.featureAbility';  
    import abilityAccessCtrl from '@ohos.abilityAccessCtrl'
    import bundle from '@ohos.bundle'
    
    async requestPermission() {
        var permissionNameUser = "ohos.permission.PERMISSION1"; // 需要动态申请的权限
        var bundleFlag = 0; // 指定ApplicationInfo对象中包含的信息的标志 默认为0
        var tokenID = undefined;
        var userID = 100; // 用户id 系统设置默认100
        var bundleName = 'ohos.acts.security.access_token.normal'; // 应用捆绑包名称
        
        // 获取应用信息
        var appInfo = await bundle.getApplicationInfo(bundleName, bundleFlag, userID);
        tokenID = appInfo.accessTokenId;
    
        // 检验权限是否已授权
        var atManager = abilityAccessCtrl.createAtManager();
        var result = await atManager.verifyAccessToken(tokenID, permissionNameUser);
        if (result == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
            // 执行操作
        } else {
            // 申请动态授权,使用接口:requestPermissionsFromUser
            let context = featureAbility.getContext();
            let resCode = 1; // 校验成功返回码
            context.requestPermissionsFromUser([permissionNameUser], resCode, (e, res) => {
                // 自己的逻辑
            })
        }
    }
    
    • Stage模型手动授权

    在stage模型下首先需要在/mian/ets/MainAbility/MainAbility.ts文件中的onCreate或onWindowStageCreate方法中,将this.context赋值给globalThis.context方便全局调用context的相关方法。

    // /mian/ets/MainAbility/MainAbility.ts globalThis.context赋值
    export default class MainAbility extends Ability {
        ...
        onWindowStageCreate(windowStage) {
            // Main window is created, set main page for this ability
            console.log("[Demo] MainAbility onWindowStageCreate")
            globalThis.context = this.context;
            windowStage.setUIContent(this.context, "pages/index", null)
        }
        ...
    };
    
    // 手动授权
    import abilityAccessCtrl from '@ohos.abilityAccessCtrl'
    import bundle from '@ohos.bundle'
    async requestPermission() {
        var permissionNameUser = "ohos.permission.PERMISSION1"; // 需要动态申请的权限
        var bundleFlag = 0; // 指定ApplicationInfo对象中包含的信息的标志 默认为0
        var tokenID = undefined;
        var userID = 100; // 用户id 系统设置默认100
        var bundleName = 'ohos.acts.security.access_token.normal'; // 应用捆绑包名称
    
        // 获取应用信息
        var appInfo = await bundle.getApplicationInfo(bundleName, bundleFlag, userID);
        tokenID = appInfo.accessTokenId;
    
        // 检验权限是否已授权
        var atManager = abilityAccessCtrl.createAtManager();
        var result = await atManager.verifyAccessToken(tokenID, permissionNameUser);
        if (result == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
          // 执行操作
        } else {
          // 申请动态授权,使用接口:requestPermissionsFromUser
          // 这里需要用到MainAbility.ts中的 globalThis.context
          globalThis.context.requestPermissionsFromUser([permissionNameUser]).then((res) => {
            // 自己的逻辑
          })
        }
      }

注意事项:

  • 每次执行需要目标权限的操作时,应用都必须检查自己是否已经具有该权限。
  • 如需检查用户是否已向您的应用授予特定权限,可以使用verifyAccessToken函数,此方法会返回。PERMISSION_GRANTED 或 PERMISSION_DENIED。
  • user_grant权限授权要基于用户可知可控的原则,需要应用在运行时主动调用系统动态申请权限的接口,系统弹框由用户授权,用户结合应用运行场景的上下文,识别出应用申请相应敏感权限的合理性,从而做出正确的选择。
  • 即使用户向应用授予过请求的权限,应用在调用受此权限管控的接口前,也应该先检查自己有无此权限,而不能把之前授予的状态持久化,因为用户在动态授予后还可以通过设置取消应用的权限。

权限配置属性介绍

应用需要在**config.json(FA 模型)或者module.json5(Stage 模型)**文件中对需要申请的权限逐个进行声明。没有声明的权限,应用无法获得此应用授权。

权限属性说明:

标签 说明
name 权限名称。
reason 当申请的权限为user_grant权限时,此字段必填,描述申请权限的原因。
usedScene 当申请的权限为user_grant权限时,此字段必填,描述权限使用的场景和时机。
abilities 标识需要使用到该权限的元能力,标签为数组形式。
when 标识权限使用的时机,值为"inuse/always",表示为仅允许前台使用和前后台都可使用。

权限等级

根据权限对于不同等级应用有不同的开放范围,权限类型分为以下三种(**normal、system_basic、system_core**),等级依次提高。

normal权限

normal 权限允许应用访问超出默认规则外的普通系统资源。这些系统资源的开放(包括数据和功能)对用户隐私以及其他应用带来的风险很小。

该类型的权限仅向应用等级(APL)为normal及以上的应用开放。

normal权限名称 授权方式 ACL使能 权限说明
ohos.permission.USE_BLUETOOTH system_grant TRUE 允许应用查看蓝牙的配置。
ohos.permission.DISCOVER_BLUETOOTH system_grant TRUE 允许应用配置本地蓝牙,查找远端设备且与之配对连接。
ohos.permission.INTERNET system_grant TRUE 允许使用Internet网络。
ohos.permission.MODIFY_AUDIO_SETTINGS system_grant TRUE 允许应用修改音频设置。
ohos.permission.GET_NETWORK_INFO system_grant TRUE 允许应用获取数据网络信息。
ohos.permission.SET_NETWORK_INFO system_grant TRUE 允许应用配置数据网络。
ohos.permission.RUNNING_LOCK system_grant TRUE 允许应用获取运行锁,保证应用在后台的持续运行。
ohos.permission.ACCESS_BIOMETRIC system_grant FALSE 允许应用使用生物特征识别能力进行身份认证。
ohos.permission.COMMONEVENT_STICKY system_grant TRUE 允许应用发布粘性公共事件。
ohos.permission.VIBRATE system_grant TRUE 允许应用控制马达振动。
ohos.permission.SET_WALLPAPER system_grant TRUE 允许应用设置静态壁纸。
ohos.permission.CLEAN_BACKGROUND_PROCESSES system_grant TRUE 允许应用根据包名清理相关后台进程。
ohos.permission.KEEP_BACKGROUND_RUNNING system_grant TRUE 允许Service Ability在后台持续运行。
ohos.permission.GET_BUNDLE_INFO system_grant TRUE 允许应用查询其他应用的信息。
ohos.permission.ACCELEROMETER system_grant TRUE 允许应用读取加速度传感器的数据。
ohos.permission.GYROSCOPE system_grant TRUE 允许应用读取陀螺仪传感器的数据。
ohos.permission.PUBLISH_AGENT_REMINDER system_grant TRUE 允许该应用使用后台代理提醒。
ohos.permission.READ_CALENDAR user_grant TRUE 允许应用读取日历信息。
ohos.permission.MICROPHONE user_grant TRUE 允许应用使用麦克风。
ohos.permission.WRITE_CALENDAR user_grant TRUE 允许应用添加、移除或更改日历活动。
ohos.permission.DISTRIBUTED_DATASYNC user_grant TRUE 允许不同设备间的数据交换。
ohos.permission.LOCATION_IN_BACKGROUND user_grant FALSE 允许应用在后台运行时获取设备位置信息。
ohos.permission.LOCATION user_grant TRUE 允许应用获取设备位置信息。
ohos.permission.MEDIA_LOCATION user_grant TRUE 允许应用访问用户媒体文件中的地理位置信息。
ohos.permission.CAMERA user_grant TRUE 允许应用使用相机拍摄照片和录制视频。
ohos.permission.READ_MEDIA user_grant TRUE 允许应用读取用户外部存储中的媒体文件信息。
ohos.permission.WRITE_MEDIA user_grant TRUE 允许应用读写用户外部存储中的媒体文件信息。
ohos.permission.ACTIVITY_MOTION user_grant TRUE 允许应用读取用户当前的运动状态。
ohos.permission.READ_HEALTH_DATA user_grant TRUE 允许应用读取用户的健康数据。
ohos.permission.ACCESS_NOTIFICATION_POLICY system_grant FALSE 在本设备上允许应用访问通知策略
ohos.permission.CLEAN_BACKGROUND_PROCESSES system_grant TRUE 允许应用根据包名清理相关后台进程
ohos.permission.KEEP_BACKGROUND_RUNNING system_grant TRUE 允许Service Ability在后台持续运行
ohos.permission.ACCESS_BIOMETRIC system_grant TRUE 允许应用使用生物特征识别能力进行身份认证
ohos.permission.GET_WIFI_INFO system_grant TRUE 允许应用获取WLAN信息
ohos.permission.SET_WIFI_INFO system_grant TRUE 允许应用配置WLAN设备
ohos.permission.EDM_MANAGE_DATETIME system_grant FALSE 允许设备管理员应用设置系统时间
ohos.permission.NFC_TAG system_grant FALSE 允许应用读取Tag卡片
ohos.permission.NFC_CARD_EMULATION system_grant FALSE 允许应用实现卡模拟功能
ohos.permission.ACCESS_CERT_MANAGER system_grant FALSE 允许应用进行私有凭据的相关操作、查询证书状态等操作

system_basic权限

system_basic权限允许应用访问操作系统基础服务相关的资源。这部分系统基础服务属于系统提供或者预置的基础功能,比如系统设置、身份认证等。这些系统资源的开放对用户隐私以及其他应用带来的风险较大。

该类型的权限仅向应用等级(APL)为system_basic等级的应用开放。

system_basic权限名称 授权方式 ACL使能 权限说明
ohos.permission.MANAGE_BLUETOOTH system_grant TRUE 允许应用配对蓝牙设备,并对设备的电话簿或消息进行访问。
ohos.permission.GET_TELEPHONY_STATE system_grant TRUE 允许应用读取电话信息。
ohos.permission.REQUIRE_FORM system_grant TRUE 允许应用获取Ability Form。
ohos.permission.PLACE_CALL system_grant TRUE 允许应用直接拨打电话。
ohos.permission.REMOVE_CACHE_FILES system_grant TRUE 允许清理指定应用的缓存。
ohos.permission.REBOOT system_grant TRUE 允许应用重启设备。
ohos.permission.SET_TIME system_grant TRUE 允许应用修改系统时间。
ohos.permission.SET_TIME_ZONE system_grant TRUE 允许应用修改系统时区。
ohos.permission.REFRESH_USER_ACTION system_grant TRUE 允许应用在收到用户事件时,重新计算超时时间。
ohos.permission.POWER_OPTIMIZATION system_grant TRUE 允许系统应用设置省电模式、获取省电模式的配置信息并接收配置变化的通知。
ohos.permission.REBOOT_RECOVERY system_grant TRUE 允许系统应用重启设备并进入恢复模式。
ohos.permission.MANAGE_LOCAL_ACCOUNTS system_grant TRUE 允许应用管理本地用户账号。
ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS system_grant TRUE 允许多个系统账号之间相互访问。
ohos.permission.READ_SCREEN_SAVER system_grant TRUE 允许应用查询屏保状态信息。
ohos.permission.WRITE_SCREEN_SAVER system_grant TRUE 允许应用修改屏保状态信息。
ohos.permission.GET_WALLPAPER system_grant TRUE 允许应用读取壁纸文件。
ohos.permission.CHANGE_ABILITY_ENABLED_STATE system_grant TRUE 允许改变应用或者组件的使能状态。
ohos.permission.ACCESS_MISSIONS system_grant TRUE 允许应用访问任务栈信息。
ohos.permission.UPDATE_CONFIGURATION system_grant TRUE 允许更新系统配置。
ohos.permission.LISTEN_BUNDLE_CHANGE system_grant TRUE 允许应用监听其他应用安装、更新、卸载状态的变化。
ohos.permission.GET_BUNDLE_INFO_PRIVILEGED system_grant TRUE 允许应用查询其他应用的信息。
ohos.permission.SET_TELEPHONY_STATE system_grant TRUE 允许应用修改telephone的状态。
ohos.permission.START_ABILIIES_FROM_BACKGROUND system_grant TRUE 允许应用在后台启动FA。
ohos.permission.BUNDLE_ACTIVE_INFO system_grant TRUE 允许系统应用查询其他应用在前台或后台的运行时间。
ohos.permission.sec.ACCESS_UDID system_grant TRUE 允许系统应用获取UDID
ohos.permission.LAUNCH_DATA_PRIVACY_CENTER system_grant TRUE 允许应用从其隐私声明页面跳转至"数据与隐私"页面。
ohos.permission.MANAGE_MEDIA_RESOURCES system_grant TRUE 允许应用程序获取当前设备正在播放的媒体资源,并对其进行管理。
ohos.permission.CONNECTIVITY_INTERNAL system_grant TRUE 允许应用程序获取网络相关的信息或修改网络相关设置。当前仅支持系统应用申请该权限。
ohos.permission.ANSWER_CALL user_grant TRUE 允许应用接听来电。
ohos.permission.READ_CALL_LOG user_grant TRUE 允许应用读取通话记录。
ohos.permission.READ_CELL_MESSAGES user_grant TRUE 允许应用读取设备收到的小区广播信息。
ohos.permission.READ_CONTACTS user_grant TRUE 允许应用读取联系人数据。
ohos.permission.READ_MESSAGES user_grant TRUE 允许应用读取短信息。
ohos.permission.RECEIVE_MMS user_grant TRUE 允许应用接收和处理彩信。
ohos.permission.RECEIVE_SMS user_grant TRUE 允许应用接收和处理短信。
ohos.permission.RECEIVE_WAP_MESSAGES user_grant TRUE 允许应用接收和处理WAP消息。
ohos.permission.SEND_MESSAGES user_grant TRUE 允许应用发送短信。
ohos.permission.WRITE_CALL_LOG user_grant TRUE 允许应用添加、移除或更改通话记录。
ohos.permission.WRITE_CONTACTS user_grant TRUE 允许应用添加、移除或更改联系人数据。
ohos.permission.MANAGE_VOICEMAIL user_grant TRUE 允许应用在语音信箱中留言
ohos.permission.SYSTEM_FLOAT_WINDOW system_grant TRUE 允许应用使用悬浮窗的能力
ohos.permission.PRIVACY_WINDOW system_grant TRUE 允许应用将窗口设置为隐私窗口,禁止截屏录屏
ohos.permission.CHANGE_ABILITY_ENABLED_STATE system_grant TRUE 允许改变应用或者组件的使能状态
ohos.permission.UPDATE_SYSTEM system_grant TRUE 允许调用升级接口
ohos.permission.FACTORY_RESET system_grant TRUE 允许调用回复出厂接口
ohos.permission.SET_ABILITY_CONTROLLER system_grant TRUE 允许设置ability组件启动和停止控制权
ohos.permission.USE_USER_IDM system_grant FALSE 允许应用访问系统身份凭据信息
ohos.permission.MANAGE_USER_IDM system_grant FALSE 允许应用使用系统身份凭据管理能力进行口令、人脸、指纹等录入、修改、删除等操作
ohos.permission.ACCESS_USER_AUTH_INTERNAL system_grant FALSE 允许应用使用系统身份认证能力进行用户身份认证或身份识别
ohos.permission.ACCESS_PIN_AUTH system_grant FALSE 允许应用使用口令输入接口,用于系统应用完成口令输入框绘制场景
ohos.permission.GET_RUNNING_INFO system_grant TRUE 允许应用获取运行态信息
ohos.permission.CLEAN_APPLICATION_DATA system_grant TRUE 允许应用清理应用数据
ohos.permission.RUNNING_STATE_OBSERVER system_grant TRUE 允许应用观察应用状态
ohos.permission.GET_WIFI_LOCAL_MAC system_grant TRUE 允许应用获取本机WLAN或者蓝牙设备的MAC地址
ohos.permission.GET_WIFI_CONFIG system_grant TRUE 允许应用获取WLAN配置信息
ohos.permission.SET_WIFI_CONFIG system_grant TRUE 允许应用配置WLAN信息
ohos.permission.MANAGE_SECURE_SETTINGS system_grant TRUE 允许应用修改安全类系统设置
ohos.permission.READ_DFX_SYSEVENT system_grant FALSE 允许获取所有应用账号信息
ohos.permission.PERMISSION_USED_STATS system_grant TRUE 允许系统应用访问权限使用记录
ohos.permission.DISTRIBUTED_SOFTBUS_CENTER system_grant FALSE 允许不同设备之间进行组网处理
ohos.permission.ACCESS_SYSTEM_SETTINGS system_grant TRUE 允许应用接入或拉起系统设置界面
ohos.permission.READ_IMAGEVIDEO user_grant TRUE 允许读取用户公共目录的图片或视频文件
ohos.permission.READ_AUDIO user_grant TRUE 允许读取用户公共目录的音频文件
ohos.permission.READ_DOCUMENT user_grant TRUE 允许读取用户公共目录的文档
ohos.permission.WRITE_IMAGEVIDEO user_grant TRUE 允许修改用户公共目录的图片或视频文件
ohos.permission.WRITE_AUDIO user_grant TRUE 允许修改用户公共目录的音频文件
ohos.permission.WRITE_DOCUMENT user_grant TRUE 允许修改用户公共目录的文档
ohos.permission.ABILITY_BACKGROUND_COMMUNICATION system_grant TRUE 允许应用将Ability组件在后台启动并与该Ability建立通信连接
ohos.permission.securityguard.REPORT_SECURITY_INFO system_grant FALSE 允许应用上报风险数据至设备风险管理平台
ohos.permission.securityguard.REQUEST_SECURITY_MODEL_RESULT system_grant TRUE 允许应用获取设备风险状态
ohos.permission.READ_ACCESSIBILITY_CONFIG system_grant FALSE 允许应用读取无障碍配置信息
ohos.permission.WRITE_ACCESSIBILITY_CONFIG system_grant FALSE 允许应用设置无障碍配置信息
ohos.permission.ACCESS_CERT_MANAGER_INTERNAL system_grant FALSE 允许应用进行证书及凭据的安装、卸载、启用、禁用等操作
ohos.permission.ACCESS_PUSH_SERVICE system_grant TRUE 允许应用访问推送服务的Ability
ohos.permission.RECEIVER_STARTUP_COMPLETED system_grant FALSE 允许应用订阅开机广播

system_core权限

system_core权限涉及到开放操作系统核心资源的访问操作。这部分系统资源是系统最核心的底层服务,如果遭受破坏,操作系统将无法正常运行。

鉴于该类型权限对系统的影响程度非常大,目前暂不向任何应用开放。

system_core权限名称 授权方式 ACL使能 权限说明
ohos.permission.ENROLL_BIOMETRIC system_grant FALSE 允许应用录入或删除生物特征数据。
ohos.permission.ACCESS_BIOMETRIC_INTERNAL system_grant FALSE 允许应用申请或释放生物特征识别的资源。
ohos.permission.RESET_BIOMETRIC_LOCKOUT system_grant FALSE 允许应用重置生物特征识别的认证失败计数。
ohos.permission.DOWNLOAD_SESSION_MANAGER system_grant TRUE 允许应用管理下载任务会话。
ohos.permission.POWER_MANAGER system_grant TRUE 允许应用调用电源管理子系统的接口,休眠或者唤醒设备。
ohos.permission.CONNECT_IME_ABILITY system_grant TRUE 允许绑定输入法Ability(InputMethodAbility)。
ohos.permission.CONNECT_SCREEN_SAVER_ABILITY system_grant TRUE 允许绑定屏保Ability(ScreenSaverAbility)。
ohos.permission.GRANT_SENSITIVE_PERMISSIONS system_grant TRUE 允许应用为其他应用授予敏感权限。
ohos.permission.REVOKE_SENSITIVE_PERMISSIONS system_grant TRUE 允许应用撤销给其他应用授予的敏感信息。
ohos.permission.GET_SENSITIVE_PERMISSIONS system_grant TRUE 允许应用读取其他应用的敏感权限的状态。
ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS_EXTENSION system_grant TRUE 允许应用跨用户对其他应用的属性进行设置。
ohos.permission.INSTALL_BUNDLE system_grant TRUE 允许应用安装、卸载其他应用。
ohos.permission.MANAGE_SHORTCUTS system_grant TRUE 允许应用查询其他应用的快捷方式信息、启动其他应用的快捷方式。
ohos.permission.radio.ACCESS_FM_AM system_grant TRUE 允许应用获取收音机相关服务。
ohos.permission.START_INVISIBLE_ABILITY system_grant TRUE 无论Ability是否可见,都允许应用进行调用。
ohos.permission.CONTROL_TASK_SYNC_ANIMATOR system_grant TRUE 允许应用使用同步任务动画。
ohos.permission.INPUT_MONITORING system_grant TRUE 允许应用监听输入事件,仅系统签名应用可申请此权限。
ohos.permission.MANAGE_MISSIONS system_grant TRUE 允许用户管理元能力任务栈。
ohos.permission.NOTIFICATION_CONTROLLER system_grant TRUE 允许应用管理通知和订阅通知。当前仅支持系统应用申请该权限。
ohos.permission.securityguard.REQUEST_SECURITY_EVENT_INFO system_grant FALSE 允许应用获取风险详细数据
ohos.permission.DOWNLOAD_SESSION_MANAGER system_grant TRUE 允许应用管理下载任务会话
ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS_EXTENSION system_grant TRUE 允许应用跨用户对其他应用的属性进行设置
ohos.permission.START_INVISIBLE_ABILITY system_grant TRUE 无论Ability是否可见,都允许应用进行调用
ohos.permission.CONTROL_TASK_SYNC_ANIMATOR system_grant TRUE 允许应用使用同步任务动画
ohos.permission.INPUT_MONITORING system_grant TRUE 允许应用监听输入事件,仅系统签名应用可申请此权限
ohos.permission.MANAGE_MISSIONS system_grant TRUE 允许用户管理元能力任务栈
ohos.permission.NOTIFICATION_CONTROLLER system_grant TRUE 允许应用管理通知和订阅通知
ohos.permission.CAPTURE_SCREEN system_grant TRUE 允许应用截取屏幕图像
ohos.permission.GET_WIFI_INFO_INTERNAL system_grant TRUE 允许应用获取WLAN信息
ohos.permission.GET_WIFI_PEERS_MAC system_grant TRUE 允许应用获取对端WLAN或者蓝牙设备的MAC地址
ohos.permission.MANAGE_WIFI_CONNECTION system_grant TRUE 允许应用管理WLAN连接
ohos.permission.MANAGE_WIFI_HOTSPOT system_grant TRUE 允许应用开启或者关闭WLAN热点
ohos.permission.GET_ALL_APP_ACCOUNTS system_grant FALSE 允许应用获取所有应用账户信息
ohos.permission.MANAGE_ENTERPRISE_DEVICE_ADMIN system_grant TRUE 允许应用激活设备管理员应用
ohos.permission.NOTIFICATION_AGENT_CONTROLLER system_grant TRUE 允许应用发送代理通知
ohos.permission.GET_DEFAULT_APPLICATION system_grant TRUE 允许应用查询默认应用
ohos.permission.SET_DEFAULT_APPLICATION system_grant TRUE 允许应用设置、重置默认应用
ohos.permission.MANAGE_DISPOSED_APP_STATUS system_grant TRUE 允许设置和查询应用的处置状态
ohos.permission.ACCESS_IDS system_grant TRUE 允许应用查询设备的唯一标识符信息
ohos.permission.DUMP system_grant TRUE 允许导出系统基础信息和SA服务信息
ohos.permission.ACCESS_DLP_FILE system_grant TRUE 允许对DLP文件进行权限配置和管理
ohos.permission.PROVISIONING_MESSAGE system_grant TRUE 允许激活超级设备管理器应用
ohos.permission.securityguard.REQUEST_SECURITY_EVENT_INFO system_grant FALSE 允许应用获取风险详细数据

应用等级(APL)

元能力权限等级APL(Ability Privilege Level)指的是应用的权限申请优先级的定义,不同APL等级的应用能够申请的权限等级不同。

应用的等级可以分为三个等级,分别是:

APL级别 说明
normal等级 普通应用。
system_basic等级 该等级的应用服务提供系统基础服务。
system_core等级 该等级的应用服务提供操作系统核心能力。

默认情况下,应用等级(APL)都为normal等级,如果应用需要将自身的等级设置为system_basic及以上的等级,需要修改应用的profile文件,在文件的"apl"字段声明应用的APL等级,并使用profile签名工具生成证书。

访问控制列表(ACL)说明

如上所述,权限等级和应用等级(APL)是一一对应的。原则上,**低等级的应用默认无法申请更高等级的权限**。

访问控制列表ACL(Access Control List)提供了解决低等级应用访问高等级权限问题的特殊渠道。

场景举例:

开发者正在开发应用A,该应用等级(APL)为normal级别。由于功能场景需要,应用A必须申请到权限B和权限C,其中,权限B的权限等级为system_basic,权限C的权限等级为normal级别。此时,推荐开发者使用ACL方式来申请权限B。

ACL方式授权说明

如果应用申请的权限中,存在部分权限的权限等级比应用APL等级高,此时直接安装应用会提示“failed to install bundle. error: install failed due to grant request permissions failed”,如下: 权限工作流程

开发者可以选择通过ACL方式来解决这个等级不匹配的问题。此时应用需要进行额外的ACL声明步骤。

应用除了需要在config.json或module.json5文件中声明所需申请的权限,还需要在应用的profile文件中声明不满足申请条件的高等级权限。

ACL授权申请方式须知

开发应用安装包时,需要修改应用的profile文件,在文件的"acl"字段声明需要申请的权限,并使用profile签名工具生成证书。签名参考

ACL授权签名应用流程

  1. 下载 Hap包签名工具,打开 developtools_hapsigner\dist文件夹,将hap-sign-tool.jar、UnsgnedDebugProfileTemplate.json和UnsgnedReleasedProfileTemplate.json 三个文件复制到 developtools_hapsigner\autosign\result文件夹。

权限工作流程

  1. cmd进入developtools_hapsigner\autosign\result文件夹,执行密钥对生成命令,生成签名密钥并保存到密钥库。这里需要记住keyAlias 和 keyPwd 下面的步骤中会使用到。
java -jar hap-sign-tool.jar generate-keypair -keyAlias "testapp" -keyAlg "ECC" -keySize "NIST-P-256" -keystoreFile "OpenHarmony.p12" -keyPwd "testapp123" -keystorePwd "123456"
  1. 执行应用签名证书生成命令,使用本地根证书(rootCA.cer)和中间CA证书(subCA.cer)签发应用签名证书。这里会使用到上一步的 keyAlias 和 keyPwd 生成应用签名证书 testapp.pem。
java -jar hap-sign-tool.jar generate-app-cert -keyAlias "testapp" -signAlg "SHA256withECDSA" -issuer "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN= OpenHarmony Application CA" -issuerKeyAlias "openharmony application ca" -subject "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN=OpenHarmony Application Release" -keystoreFile "OpenHarmony.p12" -subCaCertFile "subCA.cer" -rootCaCertFile "rootCA.cer" -outForm "certChain" -outFile "testapp.pem" -keyPwd "testapp123" -keystorePwd "123456" -issuerKeyPwd "123456" -validity "365"
  1. 调用Profile文件签名接口,使用Profile签名密钥对Profile文件进行签名。在这里需要准备Profile模板文件。首先创建ProfileTemplate.json文件。这里分两种情况:

    • 如果是生成应用**调试debug包,需要复制第1步中UnsgnedDebugProfileTemplate.json的内容,其中我们要修改三个地方: bundle-name:需要申请高等级权限的应用包。 allowed-acls:需要申请的高等级权数组。 device-ids:应用安装的设备的udid数组,cmd进入hdc_std.exe所在文件夹,运行命令 hdc_std shell bm get --udid 命令获取设备的udid。**
    {
        "version-name": "2.0.0",
        "version-code": 2,
        "uuid": "fe686e1b-3770-4824-a938-961b140a7c98",
        "validity": {
            "not-before": 1610519532,
            "not-after": 1705127532
        },
        "type": "debug",
        "bundle-info": {
            "developer-id": "OpenHarmony",
            "development-certificate": "-----BEGIN CERTIFICATE-----\nMIICMzCCAbegAwIBAgIEaOC/zDAMBggqhkjOPQQDAwUAMGMxCzAJBgNVBAYTAkNO\nMRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkgVGVh\nbTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjEwMjAy\nMTIxOTMxWhcNNDkxMjMxMTIxOTMxWjBoMQswCQYDVQQGEwJDTjEUMBIGA1UEChML\nT3Blbkhhcm1vbnkxGTAXBgNVBAsTEE9wZW5IYXJtb255IFRlYW0xKDAmBgNVBAMT\nH09wZW5IYXJtb255IEFwcGxpY2F0aW9uIFJlbGVhc2UwWTATBgcqhkjOPQIBBggq\nhkjOPQMBBwNCAATbYOCQQpW5fdkYHN45v0X3AHax12jPBdEDosFRIZ1eXmxOYzSG\nJwMfsHhUU90E8lI0TXYZnNmgM1sovubeQqATo1IwUDAfBgNVHSMEGDAWgBTbhrci\nFtULoUu33SV7ufEFfaItRzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFPtxruhl\ncRBQsJdwcZqLu9oNUVgaMAwGCCqGSM49BAMDBQADaAAwZQIxAJta0PQ2p4DIu/ps\nLMdLCDgQ5UH1l0B4PGhBlMgdi2zf8nk9spazEQI/0XNwpft8QAIwHSuA2WelVi/o\nzAlF08DnbJrOOtOnQq5wHOPlDYB4OtUzOYJk9scotrEnJxJzGsh/\n-----END CERTIFICATE-----\n",
            "bundle-name": "com.OpenHarmony.app.test",
            "apl": "normal",
            "app-feature": "hos_system_app"
        },
        "acls": {
            "allowed-acls": [
                "ohos.permission.MANAGE_BLUETOOTH"
            ]
        },
        "permissions": {
            "restricted-permissions": [
                ""
            ]
        },
        "debug-info": {
            "device-ids": [
                "69C7505BE341BDA5948C3C0CB44ABCD530296054159EFE0BD16A16CD0129CC42",
                "7EED06506FCE6325EB2E2FAA019458B856AB10493A6718C7679A73F958732865"
            ],
            "device-id-type": "udid"
        },
        "issuer": "pki_internal"
     }
    • 如果是生成应用发布的**release包,需要复制第1步中UnsgnedReleasedProfileTemplate.json的内容,其中需要修改两处: bundle-name:需要申请高等级权限的应用包。 allowed-acls:需要申请的高等级权数组。**
    {
        "version-name": "2.0.0",
        "version-code": 2,
        "app-distribution-type": "os_integration",
        "uuid": "5027b99e-5f9e-465d-9508-a9e0134ffe18",
        "validity": {
            "not-before": 1594865258,
            "not-after": 1689473258
        },
        "type": "release",
        "bundle-info": {
            "developer-id": "OpenHarmony",
            "distribution-certificate": "-----BEGIN CERTIFICATE-----\nMIICMzCCAbegAwIBAgIEaOC/zDAMBggqhkjOPQQDAwUAMGMxCzAJBgNVBAYTAkNO\nMRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkgVGVh\nbTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjEwMjAy\nMTIxOTMxWhcNNDkxMjMxMTIxOTMxWjBoMQswCQYDVQQGEwJDTjEUMBIGA1UEChML\nT3Blbkhhcm1vbnkxGTAXBgNVBAsTEE9wZW5IYXJtb255IFRlYW0xKDAmBgNVBAMT\nH09wZW5IYXJtb255IEFwcGxpY2F0aW9uIFJlbGVhc2UwWTATBgcqhkjOPQIBBggq\nhkjOPQMBBwNCAATbYOCQQpW5fdkYHN45v0X3AHax12jPBdEDosFRIZ1eXmxOYzSG\nJwMfsHhUU90E8lI0TXYZnNmgM1sovubeQqATo1IwUDAfBgNVHSMEGDAWgBTbhrci\nFtULoUu33SV7ufEFfaItRzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFPtxruhl\ncRBQsJdwcZqLu9oNUVgaMAwGCCqGSM49BAMDBQADaAAwZQIxAJta0PQ2p4DIu/ps\nLMdLCDgQ5UH1l0B4PGhBlMgdi2zf8nk9spazEQI/0XNwpft8QAIwHSuA2WelVi/o\nzAlF08DnbJrOOtOnQq5wHOPlDYB4OtUzOYJk9scotrEnJxJzGsh/\n-----END CERTIFICATE-----\n",
            "bundle-name": "com.OpenHarmony.app.test",
            "apl": "normal",
            "app-feature": "hos_system_app"
        },
        "acls": {
            "allowed-acls": [
                "ohos.permission.MANAGE_BLUETOOTH"
            ]
        },
        "permissions": {
            "restricted-permissions": []
        },
        "issuer": "pki_internal"
    }

调用以下命令对Profile文件进行签名,**注意:这里不需要修改keyAlias和keyPwd**

java -jar hap-sign-tool.jar  sign-profile -keyAlias "openharmony application profile release" -signAlg "SHA256withECDSA" -mode "localSign" -profileCertFile "OpenHarmonyProfileRelease.pem" -inFile "ProfileTemplate.json" -keystoreFile "OpenHarmony.p12" -outFile "testapp.p7b" -keyPwd "123456" -keystorePwd "123456"
  1. 调用Hap包签名接口,使用应用签名密钥给Hap包签名。需要准备未签名的包testapp-unsigned.hap,调用以下命令对hap包签名,这里需使用到keyAlias 和 keyPwd
java -jar hap-sign-tool.jar sign-app -keyAlias "testapp" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "testapp.pem" -profileFile "testapp.p7b" -inFile "testapp-unsigned.hap" -keystoreFile "OpenHarmony.p12" -outFile "testapp-signed.hap" -keyPwd "testapp123" -keystorePwd "123456"

完成签名后的hap包就可以正常安装和使用超出当前应用等级的权限,如果该权限方式是user_grant授权,还需要进行手动授权操作。

参考文献:

[1] OpenHarmony 访问控制开发概述. https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/accesstoken-overview.md

[2] OpenHarmony访问控制开发指导. https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/accesstoken-guidelines.md

[3] Hap包签名工具指导. https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/hapsigntool-guidelines.md

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部