Skip to content

权限模型概述

HarmonyOS NEXT 的权限模型基于 TokenID 和 ATM(Access Token Manager)实现细粒度访问控制。


1. 权限模型架构

┌───────────────────────────────────────────┐
│              应用层                        │
│   申请权限 → 运行时授权 → 访问资源          │
├───────────────────────────────────────────┤
│         ATM (Access Token Manager)        │
│   - TokenID 管理                          │
│   - 权限校验                               │
│   - 访问控制决策                           │
├───────────────────────────────────────────┤
│         Kernel / System Services          │
│   - 资源访问拦截                           │
│   - 权限验证                               │
└───────────────────────────────────────────┘

核心概念

概念说明
TokenID应用的唯一身份标识,用于权限校验
ATMAccess Token Manager,权限管理核心服务
Permission权限声明,定义可访问的资源或能力
ACLAccess Control List,访问控制列表

2. 权限等级分类

HarmonyOS 将权限分为四个等级:

等级英文名称说明授权方式
basicsystem_basic系统基本权限,应用默认拥有自动授予
normalnormal普通权限,低风险安装时自动授予
user_granteduser_granted用户敏感权限运行时动态申请
signaturesignature签名权限,仅系统应用签名匹配自动授予

权限等级示例

json5
// module.json5 权限声明
{
  "module": {
    "requestPermissions": [
      // normal 权限(自动授予)
      {
        "name": "ohos.permission.INTERNET",
        "reason": "$string:permission_internet_reason"
      },
      
      // user_granted 权限(需要运行时申请)
      {
        "name": "ohos.permission.CAMERA",
        "reason": "$string:permission_camera_reason",
        "usedScene": {
          "abilities": ["EntryAbility"],
          "when": "inuse"
        }
      },
      
      // signature 权限(仅系统应用)
      {
        "name": "ohos.permission.MANAGE_DEVICE",
        "reason": "$string:permission_device_reason"
      }
    ]
  }
}

3. TokenID 机制

TokenID 生成流程

应用安装

生成唯一 TokenID

注册到 ATM 服务

权限校验时使用 TokenID 标识应用身份

TokenID 获取

typescript
import { bundleManager } from '@kit.ArkKit';

async function getTokenId(): Promise<string> {
  let bundleInfo = await bundleManager.getBundleInfoForSelf(
    bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT
  );
  return bundleInfo.tokenId;
}

// 使用
let tokenId = await getTokenId();
console.log(`应用 TokenID: ${tokenId}`);

4. 权限校验流程

校验 API

typescript
import { accessControl } from '@kit.ArkKit';

// 检查权限
async function checkPermission(permissionName: string): Promise<number> {
  let result = await accessControl.verifyAccessToken({
    permissionName: permissionName,
    tokenId: await getTokenId()
  });
  return result;  // 0: 允许,非 0: 拒绝
}

// 同步检查
let syncResult = accessControl.verifyAccessTokenSync({
  permissionName: 'ohos.permission.CAMERA',
  tokenId: tokenId
});

校验结果码

结果码含义
0PERMISSION_GRANTED(已授权)
1PERMISSION_DENIED(已拒绝)
2PERMISSION_NOT_FOUND(权限不存在)
3PERMISSION_NOT_GRANTED(未授予)

5. 权限使用场景

典型场景

场景所需权限等级
网络访问INTERNETnormal
相机拍照CAMERAuser_granted
位置定位LOCATIONuser_granted
麦克风录音MICROPHONEuser_granted
读取联系人READ_CONTACTSuser_granted
写入文件WRITE_MEDIAuser_granted
蓝牙连接BLUETOOTHnormal
系统设置MANAGE_SETTINGSsignature

6. 与 Android 权限模型对比

特性HarmonyOSAndroid
身份标识TokenIDUID/GID
权限管理ATM 服务PackageManager
权限等级basic/normal/user_granted/signaturenormal/dangerous/signature
运行时申请verifyAccessToken + requestPermissionscheckSelfPermission + requestPermissions
权限组无权限组概念Permission Group
一次性授权支持支持(Android 11+)

7. 面试高频问题

Q1: TokenID 的作用是什么?

:TokenID 是应用在系统中的唯一身份标识,用于:

  1. 权限校验时标识应用身份
  2. 访问控制决策的依据
  3. 区分不同应用的资源访问

Q2: 权限等级有哪些?区别是什么?

  • system_basic:系统基本权限,默认授予
  • normal:普通权限,安装时自动授予
  • user_granted:用户敏感权限,需运行时动态申请
  • signature:签名权限,仅签名匹配的系统应用可用

Q3: 运行时权限申请的流程?

  1. module.json5 中声明权限
  2. 调用 checkAccessToken 检查是否已授权
  3. 未授权则调用 requestPermissionsFromUser 申请
  4. 根据用户授权结果处理后续逻辑

8. 最佳实践

  1. 最小权限原则:只申请必要的权限
  2. 及时释放:不再使用的权限及时释放
  3. 友好提示:申请前向用户说明用途
  4. 优雅降级:权限被拒时提供替代方案
  5. 按需申请:在需要使用功能时再申请,而非启动时批量申请

面试提示:权限模型是鸿蒙安全体系的核心,面试常考 TokenID 机制、权限等级和运行时申请流程。