鸿蒙Harmony和Android应用权限管理 对比

早期的Android对权限管理不严格,导致了一些app获取各种超过需要的权限,甚至做一些损害用户的行为,例如后台自动下载,监听短信内容,自动打电话等等。后来google认识这些问题,后期版本对权限管理严格了很多。Harmony作为后起之秀,自然在设计之初就考虑了这个问题。

Harmony应用权限管理 :

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中按格式声明。
  • 满足用户可知。应用申请的敏感权限的目的需要真实准确告知用户。
  • 权限就近申请。应用在用户触发相关业务功能时,就近提示用户授予实现此功能所需的权限。
  • 权限不扩散。在用户未授权的情况下,不允许提供给其他应用使用。
  • 应用自定义权限防止重名。建议以包名为前缀来命名权限,防止跟系统定义的权限重名。

Android应用权限管理 :

Android 将权限分为不同的类型,包括安装时权限、运行时权限和特殊权限。每种权限类型都指明了当系统授予应用该权限后,应用可以访问的受限数据范围以及应用可以执行的受限操作范围。

安装时权限
左图所示为某个应用的安装时权限列表。右图显示了一个弹出式对话框,其中包含 2 个选项:允许和拒绝。
图 2. 某应用商店中显示的某个应用的安装时权限列表。

安装时权限授予应用对受限数据的受限访问权限,并允许应用执行对系统或其他应用只有最低影响的受限操作。如果您在应用中声明了安装时权限,系统会在用户安装您的应用时自动授予应用相应权限。应用商店会在用户查看应用详情页面时向其显示安装时权限通知,如图 2 所示。

Android 提供多个安装时权限子类型,包括普通权限和签名权限。

普通权限

此类权限允许访问超出应用沙盒的数据和执行超出应用沙盒的操作。但是,这些数据和操作对用户隐私及对其他应用的操作带来的风险非常小。

系统会为普通权限分配“normal”保护级别,如权限 API 参考文档页面中所示。

签名权限

当应用声明了其他应用已定义的签名权限时,如果两个应用使用同一证书进行签名,系统会在安装时向前者授予该权限。否则,系统无法向前者授予该权限。注意:有些签名权限不适合第三方应用使用。

系统会为签名权限分配“signature”保护级别,如权限 API 参考文档页面中所示。

运行时权限
一个弹出式对话框,其中包含 2 个选项:允许和拒绝。
图 3. 当应用请求运行时权限时显示的系统权限提示。

运行时权限也称为危险权限,此类权限授予应用对受限数据的额外访问权限,并允许应用执行对系统和其他应用具有更严重影响的受限操作。因此,您需要先在应用中请求运行时权限,然后才能访问受限数据或执行受限操作。当应用请求运行时权限时,系统会显示运行时权限提示,如图 3 所示。

许多运行时权限会访问用户私有数据,这是一种特殊的受限数据,其中包含可能比较敏感的信息。例如,位置信息和联系信息就属于用户私有数据。

系统会为运行时权限分配“dangerous”保护级别,如权限 API 参考文档页面中所示。

特殊权限

特殊权限与特定的应用操作相对应。只有平台和原始设备制造商 (OEM) 可以定义特殊权限。此外,如果平台和 OEM 想要防止有人执行功能特别强大的操作(例如通过其他应用绘图),通常会定义特殊权限。

系统设置中的特殊应用访问权限页面包含一组用户可切换的操作。其中的许多操作都以特殊权限的形式实现。

每项特殊权限都有自己的实现细节。如需查看使用每项特殊权限的说明,请访问权限 API 参考文档页面。系统会为特殊权限分配“appop”保护级别。

最佳做法

应用权限基于系统安全功能,并有助于 Android 支持与用户隐私相关的以下目标:

  • 控制:用户可以控制他们与应用分享的数据。
  • 透明度:用户了解应用使用了哪些数据以及应用为何访问相关数据。
  • 数据最小化:应用仅访问和使用用户调用的特定任务或操作所需的数据。

本部分将介绍一组在应用中有效使用权限的核心最佳做法。如需详细了解如何在 Android 中使用权限,请访问应用权限最佳做法页面。

请求最少数量的权限

当用户在应用中请求执行特定操作时,应用应当只请求完成该操作所需的权限。根据您使用权限的方式,您可以通过其他方式实现应用的用例,而无需依赖于访问敏感信息。

将运行时权限与特定操作相关联

尽可能往后推迟到在应用的用例流程中请求权限。例如,如果应用允许用户向他人发送语音消息,请等到用户已导航到消息屏幕并已按下发送语音消息按钮后再请求权限。待用户按下该按钮后,应用再请求麦克风使用权限。

考虑应用的依赖项

添加某个库时,您也会继承它的权限要求。请注意每个依赖项所需的权限以及这些权限的用途。

公开透明

请求权限时,请清晰说明您要访问的内容以及访问原因,以便用户可以做出明智的决策。

以显式方式访问系统

当您访问敏感数据或硬件(例如相机或麦克风)时,请在应用中持续提供指示。此提醒可帮助用户确切了解应用何时会访问受限数据或执行受限操作。

系统组件中的权限

权限不仅仅用于请求系统功能。应用的系统组件可以限制哪些其他应用可以与您的应用交互,如介绍如何限制与其他应用的交互的页面中所述。

对比说明:

对于敏感权限,无论是Harmony还是新版本的Android都是需要动态申请。
Harmony在config.json中以”defPermissions”来描述 ,Android是在AndroidManifest.xml中描述。而且相对于Android,Harmony权限控制更严,通讯录不给随便读取和修改了。

Harmony受限开放的权限

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

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

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注