这是我参与更文挑战的第4天,活动详情查看: 更文挑战
HarmonyOS中所有的应用均在应用沙盒内运行。默认情况下,应用只能访问有限的系统资源,系统负责管理应用对资源的访问权限。 应用权限管理是由接口提供方(Ability)、接口使用方(应用)、系统(包括云侧和端侧)以及用户等多方共同参与的整个流程,保证受限接口是在约定好的规则下被正常使用,避免接口被滥用而导致用户、应用和设备受损。
权限声明
- 应用需要在config.json中使用“reqPermissions”属性对需要的权限逐个进行声明。
- 若使用到的三方库也涉及权限使用,也需统一在应用的config.json中逐个声明。
- 没有在config.json中声明的权限,应用就无法获得此权限的授权。
动态申请敏感权限
动态申请敏感权限基于用户可知可控的原则,需要应用在运行时主动调用系统动态申请权限的接口,系统弹框由用户授权,用户结合应用运行场景的上下文,识别出应用申请相应敏感权限的合理性,从而做出正确的选择。
即使用户向应用授予了请求的权限,应用在调用受此权限管控的接口前,也应该先检查自己有无此权限,而不能把之前授予的状态持久化,因为用户在动态授予后还可以通过设置取消应用的权限。
有关于应用动态申请敏感权限的详细信息,请参阅动态申请权限。
自定义权限
HarmonyOS为了保证应用对外提供的接口不被恶意调用,需要对调用接口的调用者进行鉴权。
大多情况下,系统已定义的权限满足了应用的基本需要,若有特殊的访问控制需要,应用可在config.json中以"defPermissions": []属性来定义新的权限,并通过“availableScope”和“grantMode”两个属性分别确定权限的开放范围和授权方式,使得权限定义更加灵活且易于理解。有关HarmonyOS权限开放范围和授权方式详细的描述,请参阅权限授予方式字段说明和权限限制范围字段说明。
为了避免应用自定义新权限出现重名的情况,建议应用对新权限的命名以包名的前两个字段开头,这样可以防止不同开发者的应用间出现自定义权限重名的情况。
权限保护方法
-
保护Ability:通过在config.json里对应的Ability中配置"permissions": ["
权限名
"]属性,即可实现保护整个Ability的目的,无指定权限的应用不能访问此Ability。
-
保护API:若Ability对外提供的数据或能力有多种,且开放范围或保护级别也不同,可以针对不同的数据或能力在接口代码实现中通过verifyPermission(String permissionName, int pid, int uid)来对uid标识的调用者进行鉴权。
权限使用原则
- 权限申请最小化。跟用户提供的功能无关的权限,不要申请;尽量采用其他无需权限的操作来实现相应功能(如:通过intent拉起系统UI界面由用户交互、应用自己生成uuid代替设备ID等)。
- 权限申请完整。应用所需权限(包括应用调用到的三方库依赖的权限)都要逐个在应用的config.json中按格式声明。
- 满足用户可知。应用申请的敏感权限的目的需要真实准确告知用户。
- 权限就近申请。应用在用户触发相关业务功能时,就近提示用户授予实现此功能所需的权限。
- 权限不扩散。在用户未授权的情况下,不允许提供给其他应用使用。
- 应用自定义权限防止重名。建议以包名为前缀来命名权限,防止跟系统定义的权限重名。
本地应用数据管理
提供单设备上结构化数据的存储和访问能力。使用SQLite作为持久化存储引擎,提供了多种类型的本地数据库,分别是关系型数据库(Relational Database)和对象关系映射数据库(Object Relational Mapping Database),此外还提供一种轻量级偏好数据库(Light Weight Preference Database),用以满足开发人员使用不同数据模型对应用数据进行持久化和访问的需求。
分布式数据服务
分布式数据库支持用户数据跨设备相互同步,为用户提供在多种终端设备上一致的数据访问体验。通过调用分布式数据接口,应用可以将数据保存到分布式数据库中。通过结合帐号、应用唯一标识和数据库三元组,分布式数据库对属于不同应用的数据进行隔离。
分布式文件服务
在多个终端设备间为单个设备上应用程序创建的文件提供多终端的分布式共享能力。每台设备上都存储一份全量的文件元数据,应用程序通过文件元数据中的路径,可以实现同一应用文件的跨设备访问。
数据存储管理
为应用开发者提供系统存储路径、存储设备列表,存储设备属性的查询和管理功能。