2024年最全鸿蒙HarmonyOS开发实战—安全管理(权限开发)_鸿蒙 权限(1)

本文详细解释了HarmonyOS中的权限管理机制,包括权限授予方式(system_grant和user_grant),权限限制范围(availableScope),以及Ability的访问权限控制。介绍了如何在config.json中声明权限,动态申请权限的步骤,以及API接口的使用方法。特别关注了敏感权限如位置、相机等的申请流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

取值含义请参见:表3。 system_grant 未填值或填写了取值范围以外的值时,自动赋予默认值; 不允许第三方应用填写user_grant,填写后会自动赋予默认值。 availableScope 选填,权限限制范围。不填则表示此权限对所有应用开放。 字符串数组

  • signature
  • privileged
  • restricted

取值含义请参见:表4。 空 填写取值范围以外的值时,权限限制范围不生效。 由于第三方应用并不在restricted的范围内,很少会出现权限定义者不能访问自身定义的权限的情况,所以不允许三方应用填写restricted。 label 选填,权限的简短描述,若未填写,则使用到简短描述的地方由权限名取代。 字符串 自定义 空 需要多语种适配。 description 选填,权限的详细描述,若未填写,则使用到详细描述的地方由label取代。 字符串 自定义 空 需要多语种适配。

权限授予方式字段说明

授予方式 (grantMode)说明自定义权限是否可指定该级别取值样例
system_grant在“config.json”里面声明,安装后系统自动授予。GET_NETWORK_INFO 、GET_WIFI_INFO
user_grant在“config.json”里面声明,并在使用时动态申请,用户授权后才可使用。否,如自定义则强制修改为system_grant。CAMERA、MICROPHONE

权限限制范围字段说明

权限范围 (availableScope)说明自定义权限是否可指定该级别取值样例
restricted需要开发者申请对应证书后才能被使用的特殊权限。WRITE_CONTACTS、READ_CONTACTS
signature权限定义方和使用方的签名一致。需在“config.json”里面声明后,由权限管理模块负责签名校验一致后,可使用。对应用(或Ability)操作的系统接口上由系统定义权限以及应用自定义的权限。 如:发现某Ability,连接某Ability。
privileged预置在系统版本中的特权应用可申请的权限。SET_TIME、MANAGE_USER_STORAGE
访问权限控制

Ability的访问权限控制

在config.json中填写“abilities”的“permissions”字段,即只有拥有该权限的应用可访问此Ability。下面的例子表明只有拥有“ohos.permission.CAMERA”权限的应用可以访问此ability。

"abilities": [
    {
        "name": ".MainAbility",
        "description": "$string:description_main_ability",
        "icon": "$media:hiworld",
        "label": "HiCamera",
        "launchType": "standard",
        "orientation": "portrait",
        "visible": false,
        "permissions": [
            "ohos.permission.CAMERA"
        ],
    }
]

权限保护字段说明

值说明类型取值范围默认值规则约束
permissions选填,权限名称。用以表示此ability受哪个权限保护,即只有拥有此权限的应用可访问此ability。字符串数组自定义目前仅支持填写一个权限名,若填写多个权限名,仅第一个权限名称有效。

Ability接口的访问权限控制

在Ability实现中,如需要对特定接口对调用者做访问控制,可在服务侧的接口实现中,主动通过verifyCallingPermission、verifyCallingOrSelfPermission来检查访问者是否拥有所需要的权限。

if (verifyCallingPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {
    // 调用者无权限,做错误处理
}
    // 调用者权限校验通过,开始提供服务
API接口说明

应用权限接口说明

接口原型接口详细描述
int verifyPermission(String permissionName, int pid, int uid)接口功能:查询指定PID、UID的应用是否已被授予某权限 输入参数:permissionName:权限名;pid:进程id;uid:uid 输出参数:无 返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED
int verifyCallingPermission(String permissionName)接口功能:查询IPC跨进程调用方的进程是否已被授予某权限 输入参数:permissionName:权限名 输出参数:无 返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED
int verifySelfPermission(String permissionName)接口功能:查询自身进程是否已被授予某权限 输入参数:permissionName:权限名 输出参数:无 返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED
int verifyCallingOrSelfPermission(String permissionName)接口功能:当有远端调用检查远端是否有权限,否则检查自身是否拥有权限 输入参数:permissionName:权限名 输出参数:无 返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED
boolean canRequestPermission(String permissionName)接口功能:向系统权限管理模块查询某权限是否不再弹框授权了 输入参数:permissionName:权限名 输出参数:无 返回值:true允许弹框,false不允许弹框
void requestPermissionsFromUser (String[] permissions, int requestCode)接口功能:向系统权限管理模块申请权限(接口可支持一次申请多个。若下一步操作涉及到多个敏感权限,可以这么用,其他情况建议不要这么用。因为弹框还是按权限组一个个去弹框,耗时比较长。用到哪个权限就去申请哪个) 输入参数: permissions:权限名列表;requestCode: 请求应答会带回此编码以匹配本次申请的权限请求 输出参数:无 返回值:无
void onRequestPermissionsFromUserResult (int requestCode, String[] permissions, int[] grantResults)接口功能:调用requestPermissionsFromUser后的应答接口 输入参数:requestCode:requestPermission中传入的requestCode;permissions:申请的权限名;grantResults:申请权限的结果 输出参数:无 返回值:无
动态申请权限开发步骤

在config.json文件中声明所需要的权限。

{
    "module": {
        "reqPermissions": [
            {
                "name": "ohos.permission.CAMERA",
                "reason": "$string:permreason_camera",
                "usedScene": {
                    "ability": ["com.mycamera.Ability", "com.mycamera.AbilityBackground"],
                    "when": "always"}
            }, {
            ...
            }
        ]
    }
}

使用ohos.app.Context.verifySelfPermission接口查询应用是否已被授予该权限。

  • 如果已被授予权限,可以结束权限申请流程。
  • 如果未被授予权限,继续执行下一步。

使用canRequestPermission查询是否可动态申请。

  • 如果不可动态申请,说明已被用户或系统永久禁止授权,可以结束权限申请流程。
  • 如果可动态申请,使用requestPermissionFromUser动态申请权限。
if (verifySelfPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {
    // 应用未被授予权限
    if (canRequestPermission("ohos.permission.CAMERA")) {
        // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
        requestPermissionsFromUser(
                new String[] { "ohos.permission.CAMERA" } , MY_PERMISSIONS_REQUEST_CAMERA);
    } else {
        // 显示应用需要权限的理由,提示用户进入设置授权
    }
} else {
    // 权限已被授予
}

通过重写ohos.aafwk.ability.Ability的回调函数onRequestPermissionsFromUserResult接收授予结果。

@Override
public void onRequestPermissionsFromUserResult (int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_CAMERA: {
            // 匹配requestPermissions的requestCode
            if (grantResults.length > 0
                && grantResults[0] == IBundleManager.PERMISSION_GRANTED) {
                // 权限被授予
                // 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的接口进行异常捕获处理
            } else {
                // 权限被拒绝
            }
            return;
        }
    }
}
应用权限列表
权限分类

HarmonyOS根据接口所涉数据的敏感程度或所涉能力的安全威胁影响,定义了不同开放范围与授权方式的权限来保护数据。

当前权限的开放范围分为:

  • all:所有应用可用
  • signature:平台签名应用可用
  • privileged:预置特权应用可用
  • restricted:证书可控应用可用

应用在使用对应服务的能力或数据时,需要申请对应权限。

  • 已在config.json文件中声明的非敏感权限,会在应用安装时自动授予,该类权限的授权方式为系统授权(system_grant)。
  • 敏感权限需要应用动态申请,通过运行时发送弹窗的方式请求用户授权,该类权限的授权方式为用户授权(user_grant)。

当应用调用服务时,服务会对应用进行权限检查,如果没有对应权限则无法使用该服务。

敏感权限

敏感权限的申请需要按照动态申请流程向用户申请授权。

权限分类名称权限名说明
位置ohos.permission.LOCATION允许应用在前台运行时获取位置信息。如果应用在后台运行时也要获取位置信息,则需要同时申请ohos.permission.LOCATION_IN_BACKGROUND权限。
ohos.permission.LOCATION_IN_BACKGROUND允许应用在后台运行时获取位置信息,需要同时申请ohos.permission.LOCATION权限。
相机ohos.permission.CAMERA允许应用使用相机拍摄照片和录制视频。
麦克风ohos.permission.MICROPHONE允许应用使用麦克风进行录音。
日历ohos.permission.READ_CALENDAR允许应用读取日历信息。
ohos.permission.WRITE_CALENDAR允许应用在设备上添加、移除或修改日历活动。
健身运动ohos.permission.ACTIVITY_MOTION允许应用读取用户当前的运动状态。
健康ohos.permission.READ_HEALTH_DATA允许应用读取用户的健康数据。
分布式数据管理ohos.permission.DISTRIBUTED_DATASYNC允许不同设备间的数据交换。
ohos.permission.DISTRIBUTED_DATA允许应用使用分布式数据的能力。
媒体ohos.permission.MEDIA_LOCATION允许应用访问用户媒体文件中的地理位置信息。
ohos.permission.READ_MEDIA允许应用读取用户外部存储中的媒体文件信息。
ohos.permission.WRITE_MEDIA允许应用读写用户外部存储中的媒体文件信息。
非敏感权限

非敏感权限不涉及用户的敏感数据或危险操作,仅需在config.json中声明,应用安装后即被授权。

权限名说明
ohos.permission.GET_NETWORK_INFO允许应用获取数据网络信息。
ohos.permission.GET_WIFI_INFO允许获取WLAN信息。
ohos.permission.USE_BLUETOOTH允许应用查看蓝牙的配置。
ohos.permission.DISCOVER_BLUETOOTH允许应用配置本地蓝牙,并允许其查找远端设备且与之配对连接。
ohos.permission.SET_NETWORK_INFO允许应用控制数据网络。
ohos.permission.SET_WIFI_INFO允许配置WLAN设备。
ohos.permission.SPREAD_STATUS_BAR允许应用以缩略图方式呈现在状态栏。
ohos.permission.INTERNET允许使用网络socket。
ohos.permission.MODIFY_AUDIO_SETTINGS允许应用程序修改音频设置。
ohos.permission.RECEIVER_STARTUP_COMPLETED允许应用接收设备启动完成广播。
ohos.permission.RUNNING_LOCK允许申请休眠运行锁,并执行相关操作。
ohos.permission.ACCESS_BIOMETRIC允许应用使用生物识别能力进行身份认证。
ohos.permission.RCV_NFC_TRANSACTION_EVENT允许应用接收卡模拟交易事件。
ohos.permission.COMMONEVENT_STICKY允许发布粘性公共事件的权限。
ohos.permission.SYSTEM_FLOAT_WINDOW提供显示悬浮窗的能力。
ohos.permission.VIBRATE允许应用程序使用马达。
ohos.permission.USE_TRUSTCIRCLE_MANAGER允许调用设备间认证能力。
ohos.permission.USE_WHOLE_SCREEN允许通知携带一个全屏IntentAgent。
ohos.permission.SET_WALLPAPER允许设置静态壁纸。
ohos.permission.SET_WALLPAPER_DIMENSION允许设置壁纸尺寸。
ohos.permission.REARRANGE_MISSIONS允许调整任务栈。
ohos.permission.CLEAN_BACKGROUND_PROCESSES允许根据包名清理相关后台进程。
ohos.permission.KEEP_BACKGROUND_RUNNING允许Service Ability在后台继续运行。
ohos.permission.GET_BUNDLE_INFO查询其他应用的信息。
ohos.permission.ACCELEROMETER允许应用程序读取加速度传感器的数据。
ohos.permission.GYROSCOPE允许应用程序读取陀螺仪传感器的数据。
ohos.permission.MULTIMODAL_INTERACTIVE允许应用订阅语音或手势事件。
ohos.permission.radio.ACCESS_FM_AM允许用户获取收音机相关服务。
ohos.permission.NFC_TAG允许应用读写Tag卡片。
ohos.permission.NFC_CARD_EMULATION允许应用实现卡模拟功能。
受限开放的权限

受限开放的权限通常是不允许三方应用申请的。如果有特殊场景需要使用,请提供相关申请材料到应用市场申请相应权限证书。如果应用未申请相应的权限证书,却试图在config.json文件中声明此类权限,将会导致应用安装失败。另外,由于此类权限涉及到用户敏感数据或危险操作,当应用申请到权限证书后,还需按照动态申请权限的流程向用户申请授权。

权限分类名称典型场景权限名说明
通讯录社交、通讯、备份和恢复用户信息、电话拦截等ohos.permission.READ_CONTACTS允许应用读取联系人数据。
通讯、备份和恢复用户信息等ohos.permission.WRITE_CONTACTS允许应用添加、移除和更改联系人数据。

最后,为了能让大家更好的去学习提升鸿蒙 (Harmony OS) 开发技术,小编连夜整理了一份30个G纯血版学习资料(含视频电子书学习文档等)以及一份在Github上持续爆火霸榜的《纯血版华为鸿蒙 (Harmony OS)开发手册》(共计890页),希望对大家有所帮助。

纯血版鸿蒙 HarmonyOS 4.0 视频学习资料

需要以上视频学习资料小伙伴

请点击→纯血版全套鸿蒙HarmonyOS学习资料


《纯血版华为鸿蒙 (Harmony OS)开发手册》

这份手册涵盖了当前鸿蒙 (Harmony OS) 开发技术必掌握的核心知识点

纯血版鸿蒙 (Harmony OS)开发手册部分精彩内容

HarmonyOS 概念:

  • 系统定义
  • 技术架构
  • 技术特性
  • 系统安全

如何快速入门?

  • 基本概念
  • 构建第一个ArkTS应用
  • 构建第一个JS应用
  • ……


开发基础知识:

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值