OpenHarmony应用权限管理
基本概念 默认情况下,应用只能访问有限的系统资源。但某些情况下,应用为了扩展功能的诉求,需要访问额外的系统或其他应用的数据(包括用户个人数据)、功能。系统或应用也必须以明确的方式对外提供接口来共享其数据或功能。OpenHarmony提供了一种访问控制机制来保证这些数据或功能不会被不当或恶意使用,即应用权限。 应用权限保护的对象可以分为数据和功能: 数据包含了个人数据(如照片、通讯录、日历、位
基本概念
默认情况下,应用只能访问有限的系统资源。但某些情况下,应用为了扩展功能的诉求,需要访问额外的系统或其他应用的数据(包括用户个人数据)、功能。系统或应用也必须以明确的方式对外提供接口来共享其数据或功能。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)时,请完成以下步骤:
-
在config.json(FA 模型)或者module.json5(Stage 模型)文件文件中,声明应用需要请求的权限,此步骤与系统授权一致。
-
在开发中需要使用代码来调用用户手动授权操作,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) => { // 自己的逻辑 }) } }
-
注意事项:
-
每次执行需要目标权限的操作时,应用都必须检查自己是否已经具有该权限。
-
如需检查用户是否已向您的应用授予特定权限,可以使用函数,此方法会返回。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授权签名应用流程
-
下载,打开 developtools_hapsigner\dist文件夹,将hap-sign-tool.jar、UnsgnedDebugProfileTemplate.json和UnsgnedReleasedProfileTemplate.json 三个文件复制到 developtools_hapsigner\autosign\result文件夹。
-
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"
-
执行应用签名证书生成命令,使用本地根证书(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"
-
调用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"
-
调用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 访问控制开发概述.
[2] OpenHarmony访问控制开发指导.
[3] Hap包签名工具指导.
更多推荐
所有评论(0)