鸿蒙HarmonyOS开发实战

您所在的位置:网站首页 鸿蒙应用程序包格式 鸿蒙HarmonyOS开发实战

鸿蒙HarmonyOS开发实战

2024-07-16 03:52:07| 来源: 网络整理| 查看: 265

运作机制

系统所有应用均在应用沙盒内运行。默认情况下,应用只能访问有限的系统资源,系统负责管理应用对资源的访问权限。这些限制是通过DAC(Discretionary Access Control)、MAC(Mandatory Access Control)以及本文描述的应用权限机制等多种不同的形式实现的。因应用需要实现其某些功能而必须访问系统或其他应用的数据或操作某些器件,此时就需要系统或其他应用能提供接口,考虑到安全,就需要对这些接口采用一种限制措施,这就是称为“应用权限”的安全机制。

接口的提供涉及到其权限的命名和分组、对外开放的范围、被授予的应用、以及用户的参与和体验。应用权限管理模块的目的就是负责管理由接口提供方(访问客体)、接口使用方(访问主体)、系统(包括云侧和端侧)和用户等共同参与的整个流程,保证受限接口是在约定好的规则下被正常使用,避免接口被滥用而导致用户、应用和设备受损。

权限声明 应用需要在config.json中使用“reqPermissions”属性对需要的权限逐个进行声明。若使用到的三方库也涉及权限使用,也需统一在应用的config.json中逐个声明。没有在config.json中声明的权限,应用就无法获得此权限的授权。 动态申请敏感权限

动态申请敏感权限基于用户可知可控的原则,需要应用在运行时主动调用系统动态申请权限的接口,系统弹框由用户授权,用户结合应用运行场景的上下文,识别出应用申请相应敏感权限的合理性,从而做出正确的选择。

即使用户向应用授予了请求的权限,应用在调用受此权限管控的接口前,也应该先检查自己有无此权限,而不能把之前授予的状态持久化,因为用户在动态授予后还可以通过设置取消应用的权限。

自定义权限

HarmonyOS为了保证应用对外提供的接口不被恶意调用,需要对调用接口的调用者进行鉴权。

大多情况下,系统已定义的权限满足了应用的基本需要,若有特殊的访问控制需要,应用可在config.json中以"defPermissions": []属性来定义新的权限,并通过“availableScope”和“grantMode”两个属性分别确定权限的开放范围和授权方式,使得权限定义更加灵活且易于理解。

为了避免应用自定义新权限出现重名的情况,建议应用对新权限的命名以包名的前两个字段开头,这样可以防止不同开发者的应用间出现自定义权限重名的情况。

权限保护方法 保护Ability:通过在config.json里对应的Ability中配置"permissions": [“权限名”]属性,即可实现保护整个Ability的目的,无指定权限的应用不能访问此Ability。保护API:若Ability对外提供的数据或能力有多种,且开放范围或保护级别也不同,可以针对不同的数据或能力在接口代码实现中通过verifyPermission(String permissionName, int pid, int uid)来对uid标识的调用者进行鉴权。 约束与限制 同一应用自定义权限个数不能超过1024个。同一应用申请权限个数不能超过1024个。为避免与系统权限名冲突,应用自定义权限名不能以ohos开头,且权限名长度不能超过256字符。自定义权限授予方式不能为user_grant。自定义权限开放范围不能为restricted。 权限开发 场景介绍

HarmonyOS支持开发者自定义权限来保护能力或接口,同时开发者也可申请权限来访问受权限保护的对象。

权限申请

开发者需要在config.json文件中的“reqPermissions”字段中声明所需要的权限。

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

权限申请格式采用数组格式,可支持同时申请多个权限,权限个数最多不能超过1024个。

键值说明类型取值范围默认值规则约束name必须,填写需要使用的权限名称。字符串自定义无未填写时,解析失败。reason可选,当申请的权限为user_grant权限时此字段必填。 描述申请权限的原因。字符串显示文字长度不能超过256个字节。空user_grant权限必填,否则不允许在应用市场上架。 需做多语种适配。usedScene可选,当申请的权限为user_grant权限时此字段必填。 描述权限使用的场景和时机。场景类型有:ability、when(调用时机)。可配置多个ability。ability:字符串数组 when:字符串ability:ability的名称 when:inuse(使用时)、always(始终)ability:空 when:inuseuser_grant权限必填ability,可选填when。

如果声明使用的权限的grantMode是system_grant,则权限会在当应用安装的时候被自动授予。

如果声明使用的权限的grantMode是user_grant,则必须经用户手动授权(用户在弹框中授权或进入权限设置界面授权)才可使用。用户会看到reason字段中填写的理由,来帮助用户决定是否给予授权。

说明 对于授权方式为user_grant的权限,每一次执行需要这一权限的操作时,都需要检查自身是否有该权限。当自身具有权限时,才可继续执行,否则应用需要请求用户授予权限。

自定义权限

开发者需要在config.json文件中的“defPermissions”字段中自定义所需的权限:

{ "module": { "defPermissions": [ { "name": "com.myability.permission.MYPERMISSION", "grantMode": "system_grant", "availableScope": ["signature"] }, { ... } ] } }

权限定义格式采用数组格式,可支持同时定义多个权限,自定义的权限个数最多不能超过1024个。

defPermissions权限定义字段说明

键值说明类型取值范围默认值规则约束name必填,权限名称。为最大可能避免重名,采用反向域公司名+应用名+权限名组合。字符串自定义无第三方应用不允许填写系统存在的权限,否则安装失败。未填写解析失败。权限名长度不能超过256个字符。grantMode必填,权限授予方式。字符串user_grant(用户授权)system_grant(系统授权)取值含义请参见:表3。system_grant未填值或填写了取值范围以外的值时,自动赋予默认值; 不允许第三方应用填写user_grant,填写后会自动赋予默认值。availableScope选填,权限限制范围。不填则表示此权限对所有应用开放。字符串数组signatureprivilegedrestricted取值含义请参见:表4。空填写取值范围以外的值时,权限限制范围不生效。 由于第三方应用并不在restricted的范围内,很少会出现权限定义者不能访问自身定义的权限的情况,所以不允许三方应用填写restricted。label选填,权限的简短描述,若未填写,则使用到简短描述的地方由权限名取代。字符串自定义空需要多语种适配。description选填,权限的详细描述,若未填写,则使用到详细描述的地方由label取代。字符串自定义空需要多语种适配。 user_grant(用户授权)system_grant(系统授权)

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

signatureprivilegedrestricted

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

权限授予方式字段说明

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

权限限制范围字段说明

权限范围 (availableScope)说明自定义权限是否可指定该级别取值样例restricted需要开发者申请对应证书后才能被使用的特殊权限。否WRITE_CONTACTS、READ_CONTACTSsignature权限定义方和使用方的签名一致。需在“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_GRANTEDint verifyCallingPermission(String permissionName)接口功能:查询IPC跨进程调用方的进程是否已被授予某权限 输入参数:permissionName:权限名 输出参数:无 返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTEDint verifySelfPermission(String permissionName)接口功能:查询自身进程是否已被授予某权限 输入参数:permissionName:权限名 输出参数:无 返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTEDint verifyCallingOrSelfPermission(String permissionName)接口功能:当有远端调用检查远端是否有权限,否则检查自身是否拥有权限 输入参数:permissionName:权限名 输出参数:无 返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTEDboolean 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设备。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。 img img img img img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取) img

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

😝朋友们如果有需要的话,可以联系领取~

1️⃣零基础入门 ① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

2️⃣视频配套工具&国内外网安书籍、文档 ① 工具

② 视频

image1

③ 书籍

image2

资源较为敏感,未展示全面,需要的最下面获取

在这里插入图片描述在这里插入图片描述

② 简历模板

在这里插入图片描述

因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆

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

6e4397753dab12e.png#pic_center)

资源较为敏感,未展示全面,需要的最下面获取

在这里插入图片描述在这里插入图片描述

② 简历模板

在这里插入图片描述

因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆

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



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭