泗泾做网站,自己开发微信小程序教程,中山权威发布,东莞全网推广关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 一、引言
随着信息技术的飞速发展#xff0c;移动应用程序已经成为… 关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 一、引言
随着信息技术的飞速发展移动应用程序已经成为人们生活和工作中不可或缺的一部分。然而随之而来的是对应用程序安全性的更高要求尤其在用户隐私保护方面。工信部一直高度重视用户隐私保护并依据《个人信息保护法》、《电信条例》、《规范互联网信息服务市场秩序若干规定》、《电信和互联网用户个人信息保护规定》等相关法律法规规章对涉及用户隐私获取做出明确的通知防止未经用户授权访问用户隐私信息以及用户隐私信息的滥用。
HarmonyOS的应用程序访问控制机制在这种背景下显得尤为重要不仅可以保护用户的个人信息还可以提高应用程序的安全性和可靠性增强用户对应用程序的信任。HarmonyOS应用程序中默认情况下应用只能访问有限的系统资源需要访问额外的系统数据包括用户个人数据和功能应用必须以明确的方式对外提供接口来共享其数据或功能。通过访问控制机制避免数据或功能被不当或恶意使用。
我将继续深入探究HarmonyOS应用程序访问控制的原理、方法和实践为开发者和用户提供有益的参考。通过对HarmonyOS访问控制机制的探究我们可以更好地理解其工作原理和优势为开发更加安全可靠的应用程序提供指导。同时我们也可以为用户提供更好的使用体验让用户更加放心地使用HarmonyOS应用程序。
二、HarmonyOS应用程序访问控制的重要性
1保护用户数据安全
在移动应用程序中用户的数据往往包含敏感信息如个人身份信息、财务信息等。如果应用程序没有有效的访问控制机制这些数据可能会被恶意应用程序窃取或滥用。HarmonyOS的访问控制机制可以限制应用程序对用户数据的访问权限从而保护用户数据的安全。HarmonyOS根据不同的授权方式权限类型分为以下两种 system_grant系统授权在该类型的权限许可下应用被允许访问的数据不会涉及到用户或设备的敏感信息应用被允许执行的操作对系统或者其他应用产生的影响可控。申请该权限的应用系统会在用户安装应用时自动把相应权限授予应用。 user_grant用户授权在该类型的权限许可下应用被允许访问的数据将会涉及到用户或设备的敏感权限应用被允许执行的操作可能对系统或其他应用产生严重的影响。该类型权限不仅需要在安装包中申请权限还需要在应用动态运行时通过发送弹窗的方式请求用户授权。在用户手动允许授权后应用才会真正获取相应的权限从而成功访问操作目标对象。
2防止应用程序滥用权限
一些应用程序可能会过度申请权限从而获取用户的隐私信息或进行不必要的操作。HarmonyOS的访问控制机制可以对应用程序的权限进行严格管理防止应用程序滥用权限。HarmonyOS提出了受限开放的权限比如允许读写用户公共目录的音频文件ohos.permission.READ_AUDIO/WRITE_AUDIO允许应用使用全局悬浮窗的能力ohos.permission.SYSTEM_FLOAT_WINDOW等权限若特殊场景需要使用这些受限开放权限则需要提供相关申请材料到应用市场申请相应权限证书通过后才可以正常使用。
3提高系统安全性
HarmonyOS的访问控制机制不仅可以保护用户数据的安全还可以提高系统的安全性。通过限制应用程序的访问权限可以防止恶意应用程序对系统进行攻击或破坏。
三、HarmonyOS应用程序访问控制的原理
1应用权限
HarmonyOS采用了权限管理机制对应用程序的访问权限进行严格控制。应用程序在安装时需要声明所需的权限用户在安装应用程序时可以查看这些权限并决定是否授予。在运行时系统会根据应用程序的权限声明和用户的授权情况对应用程序的访问请求进行权限检查。
为了防止应用过度索取和滥用权限HarmonyOS中基于APLAbility Privilege Level元能力权限等级等级配置了不同的权限开放范围。应用APL等级分为以下三个等级等级依次提高。
APL级别说明normal默认情况下应用的APL等级都是normal等级。system_basic该等级的应用服务提供系统基础服务。system_core该等级的应用服务提供操作系统核心能力。应用APL等级不允许配置为system_core。
根据权限对于不同等级应用有不同的开放范围权限APL等级对应分为以下三个等级等级依次提高。
APL级别说明开放范围normal允许应用访问超出默认规则的普通系统资源如配置Wi-Fi信息、调用相机拍摄等。 这些系统资源的开放包括数据和功能对用户隐私以及其他应用带来的风险低。APL等级为normal及以上的应用。system_basic允许应用访问操作系统基础服务系统提供或者预置的基础功能相关的资源如系统设置、身份认证等。 这些系统资源的开放对用户隐私以及其他应用带来的风险较高。- APL等级为system_basic及以上的应用。 - 部分权限对normal级别的应用受限开放需要额外申请。system_core涉及开放操作系统核心资源的访问操作。这部分系统资源是系统最核心的底层服务如果遭受破坏操作系统将无法正常运行。- APL等级为system_core的应用。 - 仅对系统应用开放。
2沙箱机制
HarmonyOS采用了沙箱机制系统中运行的应用程序均部署在受限保护的沙箱中通过沙箱的安全隔离机制可以限制应用程序的不当行为如应用间非法访问数据、篡改设备等。沙箱环境中每个程序都拥有唯一的IDTokenID系统基于此ID识别与限制应用的访问行为从而提高系统的安全性。同时沙箱机制还可以防止应用程序之间的互相干扰提高系统的稳定性。
3系统控件
HarmonyOS提供了系统Picker、安全控件等临时授权的方式替代权限申请在特定的场景中应用无需向用户申请权限也可以临时访问受限资源实现精准化权限管控更好地保护用户隐私。 系统Picker由系统独立进程实现在应用拉起Picker并由用户操作Picker后应用可以获取Picker返回的资源或结果。举例说明当应用需要读取用户图片时可通过使用照片Picker在用户选择所需要的图片资源后直接返回该图片资源而不需要授予应用读取图片文件的权限。 安全控件由系统提供UI控件应用在界面内集成对应控件用户点击后应用将获得临时授权从而执行相关操作。举例说明当应用需要分享当前位置时可使用位置控件用户点击后将会在本次前台期间获得精准定位的授权可以调用位置服务获取精准定位。当发生灭屏、应用切后台、应用退出等任一情况时临时授权结束。
四、 HarmonyOS应用程序访问控制开发指南
1选择申请权限的方式 最小权限原则即在应用开发初期开发者应仔细分析应用的功能和业务逻辑确定所需的权限避免过度申请权限以免引起用户的疑虑和不信任。 动态申请权限即在应用运行时根据实际业务场景动态申请权限提高用户体验减少不必要的权限请求干扰。
在HarmonyOS中每个权限的权限等级、授权方式不同申请权限的方式也不同开发者在申请权限前需要先根据应用权限列表和应用申请权限的方式参见下表查看能否申请目标权限。
权限类型授权方式操作路径所有应用可申请system_grant声明权限 访问接口所有应用可申请user_grant声明权限 向用户申请授权 访问接口受限开放权限system_grant申请使用受限权限 声明权限 访问接口受限开放权限user_grant申请使用受限权限 声明权限 向用户申请授权 访问接口
以位置服务Location Kit为例应用需要检查是否已经获取用户授权访问设备位置信息若未获取授权可以向用户申请需要的位置权限。
权限名称权限级别授权方式说明ohos.permission.LOCATIONnormaluser_grant允许应用获取设备位置信息。 需要与模糊位置权限一起申请。ohos.permission.APPROXIMATELY_LOCATIONnormalUser_grant允许应用获取设备模糊位置信息。
2声明权限
根据实际的业务需要确定需要的权限后需要在module.json5配置文件的requestPermissions标签中声明位置服务Location Kit所需的权限。
{module: {...requestPermissions: [{name: ohos.permission.LOCATION, // 权限名称为系统已定义的权限reason: $string:location_reason, // 申请权限的原因当申请权限为user_grant权限时该字段为必填usedScene: { // 用于描述权限使用场景当申请权限为user_grant权限时该字段为必填abilities: [EntryAbility],when: inuse // 调用时机inuse使用时always始终}},{name: ohos.permission.APPROXIMATELY_LOCATION,reason: $string:location_reason,usedScene: {abilities: [EntryAbility],when: inuse}}]}
}
3向用户申请授权封装
大多数应用程序都会根据业务需要向用户申请授权可利用抽象理念将向用户申请授权代码封装成可复用的模块或组件。通过定义清晰的接口和规范可以提高代码的可维护性和可扩展性同时降低不同应用场景的适配难度。
在工程entry模块src/main/ets目录下创建common文件夹用于存放工程需要的基础公共代码比如常量类AppConstants、权限控制工具类PermissionUtil等。
在common utils目录创建ArkTS文件PermissionUtil并使用export导出该类。
/*** description 权限控制工具类* author 白晓明*/
export class PermissionUtil {
}
用户每次执行需要目标权限的操作时应用都必须调用checkAccessToken()方法检查自身是否已经具有该权限该方法返回已授权PERMISSION_GRANTED或未授权PERMISSION_DENIED。在PermissionUtil中添加静态方法checkPermissionGrant用于检查当前应用程序是否已经被授予权限。
/*** 校验应用是否被授予 {permission} 权限* param permission* returns*/
static checkPermissionGrant(permission: Permissions): abilityAccessCtrl.GrantStatus {const atManager abilityAccessCtrl.createAtManager();// 初始化grantStatus为未授权let grantStatus: abilityAccessCtrl.GrantStatus abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;let tokenId: number 0;try {// 获取应用程序的accessTokenIDconst bundleInfo: bundleManager.BundleInfo bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);const appInfo: bundleManager.ApplicationInfo bundleInfo.appInfo;tokenId appInfo.accessTokenId;// 校验应用是否被授予权限grantStatus atManager.checkAccessTokenSync(tokenId, permission);console.log(检查${permission}权限状态为${grantStatus abilityAccessCtrl.GrantStatus.PERMISSION_DENIED ? 未授权 : 已授权});} catch (error) {const err error as BusinessError;console.error(检查${permission}权限异常${JSON.stringify(err)});grantStatus abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;}return grantStatus;
}
在校验应用是否被授予权限时若未授权需要调用requestPermissionsFromUser()方法动态向用户申请权限指应用程序运行时向用户请求授权的过程。在PermissionUtil中添加静态方法reqPermissionFromUser方法动态向用户申请授权。
/*** 动态申请权限* param permissions* returns */
static async reqPermissionFromUser(permissions: Permissions[]): Promisenumber[] {console.log([AppLogger]动态申请权限开始);const atManager abilityAccessCtrl.createAtManager();let result: PermissionRequestResult { permissions: [], authResults: [] };try {result await atManager.requestPermissionsFromUser(context, permissions);} catch (error) {const err error as BusinessError;console.error([AppLogger]动态申请权限异常${JSON.stringify(err)});}return result.authResults;
}
4在UI中向用户申请授权
import { abilityAccessCtrl, Permissions } from kit.AbilityKit
import { PermissionUtil } from ../common/utils/PermissionUtil;
Entry
Component
struct Index {
private locationPermissions: Permissions[] [ohos.permission.LOCATION,ohos.permission.APPROXIMATELY_LOCATION];
async aboutToAppear(): Promisevoid {// 校验是否被授予定位权限let flag: boolean false;for (const permission of this.locationPermissions) {flag false;const grantStatus: abilityAccessCtrl.GrantStatus PermissionUtil.checkPermissionGrant(permission);if (grantStatus abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {flag true;}}if (!flag) { // 未授权则弹出授权提示弹窗await PermissionUtil.reqPermissionFromUser(this.locationPermissions);}}
build() {...}
}
5效果预览 五、结论
HarmonyOS应用程序访问控制机制是保障用户数据安全和系统安全的重要手段。通过权限管理、沙箱机制、系统控件等多种方法HarmonyOS可以有效地限制应用程序对系统资源的访问权限防止应用程序滥用权限和恶意攻击。