第19章_HarmonyOs开发图解之 安全管理
·
第19章 HarmonyOs开发图解之 安全管理
HarmonyOS 学习系统 | 阶段三:高级深耕期
学习目标
| 序号 | 能力 |
|---|---|
| 1 | 理解 HarmonyOS 三级权限体系(system_grant / user_grant / restricted) |
| 2 | 掌握权限动态申请的标准五步流程 |
| 3 | 了解应用沙盒机制和生物特征识别认证 |
核心图解

内容讲解
19.1 安全管理概述
HarmonyOS 的安全管理围绕"应用沙盒"和"权限体系"两大核心机制展开。每个应用运行在独立的沙盒中,默认无法访问其他应用的数据。如果需要访问系统资源(如相机、通讯录等),必须向系统申请对应权限。
生活化类比:应用沙盒就像"独立办公室"
每个应用都被关在自己的办公室(沙盒)里,默认不能去别人的办公室拿东西。但如果你的工作需要用到公共打印机(系统能力),就得向大楼管理员(系统)申请一张"通行证"(权限)。敏感通行证(如进入财务室 = 访问联系人)还需要大楼里每个人的同意(用户授权)。非敏感通行证(如使用走廊 = WIFI 信息)管理员直接就发了。
19.2 三级权限体系
HarmonyOS 将权限分为三个等级:
| 等级 | 授权方式 | 典型权限 | 说明 |
|---|---|---|---|
| system_grant(非敏感) | 系统自动授予 | INTERNET、GET_WIFI_INFO、VIBRATE | 安装时自动获得,无需用户确认 |
| user_grant(敏感) | 需用户手动授权 | CAMERA、MICROPHONE、LOCATION、READ_MEDIA | 运行时弹窗,用户同意后才授予 |
| restricted(受限开放) | 需权限证书 | READ_CONTACTS、WRITE_CONTACTS | 仅预装应用或通过认证的应用可申请 |
19.3 权限申请标准流程
权限申请分为五步:声明 -> 检查 -> 判断是否可申请 -> 申请 -> 处理结果。
// Step 1: 在 config.json 中声明权限
"reqPermissions": [
{ "name": "ohos.permission.CAMERA", "reason": "需要使用相机拍照", "usedScene": "拍照功能" }
]
// Step 2: 检查是否已授权
if (verifySelfPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {
// Step 3: 检查是否可动态申请
if (canRequestPermission("ohos.permission.CAMERA")) {
// Step 4: 动态申请权限
requestPermissionsFromUser(
new String[]{"ohos.permission.CAMERA"}, REQUEST_CODE);
} else {
// 用户已拒绝且勾选了"不再询问",引导到设置页面
showGoToSettingDialog();
}
}
// Step 5: 处理授权结果
@Override
public void onRequestPermissionsFromUserResult(int requestCode,
String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE) {
if (grantResults[0] == IBundleManager.PERMISSION_GRANTED) {
// 授权成功,执行操作
openCamera();
} else {
// 授权被拒绝,优雅降级
showPlaceholderImage();
}
}
}
19.4 生物特征识别
HarmonyOS 支持 2D/3D 人脸识别,在摄像头和 TEE(可信执行环境)之间建立安全通道,确保人脸数据不会被 REE(富执行环境)中的应用获取。
// 生物特征识别认证
BioAuthnManager authnManager = new BioAuthnManager();
authnManager.auth(new AuthParam.Builder()
.setChallenge("challenge_string".getBytes())
.setAuthType(BioAuthnManager.AuthType.FACE_ONLY)
.build(), new BioAuthnCallback() {
@Override
public void onAuthResult(int result, BioAuthnAuthResult authResult) {
if (result == BioAuthnManager.SUCCESS) {
// 认证成功
HiLog.info(TAG, "人脸认证成功");
}
}
});
代码速查卡
| API | 功能 | 示例 |
|---|---|---|
verifySelfPermission(name) |
检查是否已授权 | verifySelfPermission("ohos.permission.CAMERA") |
canRequestPermission(name) |
是否可动态申请 | canRequestPermission("ohos.permission.CAMERA") |
requestPermissionsFromUser(permissions, code) |
动态申请权限 | requestPermissionsFromUser(new String[]{...}, 100) |
onRequestPermissionsFromUserResult() |
处理授权结果 | 重写此回调方法 |
BioAuthnManager |
生物特征识别管理 | new BioAuthnManager() |
authnManager.auth(param, callback) |
发起生物识别认证 | authnManager.auth(param, callback) |
与 Android/iOS 对比
| 特性 | HarmonyOS | Android | iOS |
|---|---|---|---|
| 权限声明 | config.json reqPermissions | AndroidManifest.xml | Info.plist |
| 运行时授权 | requestPermissionsFromUser | requestPermissions() | requestAuthorization() |
| 权限等级 | system_grant / user_grant / restricted | normal / dangerous | 使用时授权 |
| 生物识别 | BioAuthnManager(TEE) | BiometricPrompt | LocalAuthentication |
| 沙盒机制 | 应用级沙盒 | 应用级沙盒(Android 10+) | 应用级沙盒 |
⚠️ 踩坑回忆录
用户拒绝了权限,我的 App 直接崩溃了
这是新手最常见的错误——没有处理权限被拒绝的情况。用户拒绝 CAMERA 权限后,代码仍然去调用相机 API,结果抛出 SecurityException 直接崩溃。正确做法是:权限被拒绝后,引导用户到系统设置页面手动开启(通过 Intent 跳转到应用设置),或者优雅地降级功能(比如没有相机权限就显示占位图而非直接崩溃)。
另一个坑:自定义权限名不能以 “ohos” 开头,且同一应用自定义权限不能超过 1024 个。这些限制在文档的角落里,不仔细看很容易踩到。
必做实操任务
| 序号 | 任务 | 难度 |
|---|---|---|
| 1 | 实现相机权限的动态申请,包含拒绝后的引导逻辑 | 中 |
| 2 | 查看 SystemPermission 类中定义的全部权限列表 | 低 |
| 3 | 实现多权限批量申请(相机 + 麦克风 + 存储) | 中 |
| 4 | 实现生物特征识别认证登录 | 高 |
| 5 | 实现权限被拒绝后的优雅降级 UI | 中 |
学习检查清单
- 能说出三级权限体系的区别(system_grant / user_grant / restricted)
- 能实现权限动态申请的五步标准流程
- 能处理权限被拒绝的情况(引导设置 / 功能降级)
- 理解应用沙盒的概念和作用
- 能说出 TEE 和 REE 的区别
- 了解生物特征识别的安全机制
- 知道为什么自定义权限名不能以 “ohos” 开头
- 能区分哪些权限需要用户授权,哪些系统自动授予
进阶方向
- 深入研究 HarmonyOS 的 TEE 安全架构
- 学习自定义权限的定义和使用
- 探索企业级安全管理(MDM)和证书管理
] 了解生物特征识别的安全机制 - 知道为什么自定义权限名不能以 “ohos” 开头
- 能区分哪些权限需要用户授权,哪些系统自动授予
进阶方向
- 深入研究 HarmonyOS 的 TEE 安全架构
- 学习自定义权限的定义和使用
- 探索企业级安全管理(MDM)和证书管理
更多推荐



所有评论(0)