当前位置: 首页 > news >正文

OpenHarmony子系统开发 - 安全(二)

OpenHarmony子系统开发 - 安全(二)

三、应用权限管理开发指导

运作机制

由于OpenHarmony允许安装三方应用,所以需要对三方应用的敏感权限调用进行管控,具体实现是应用在开发阶段就需要在应用配置文件中指明此应用在运行过程中可能会调用哪些敏感权限,这些权限包括静态权限和动态权限,静态权限表示只需要在安装阶段注册就可以,而动态权限一般表示获取用户的敏感信息,所以需要在运行时让用户确认才可以调用,授权方式包括系统设置应用手动授权等。除了运行时对应用调用敏感权限进行管控外,还需要利用应用签名管控手段确保应用安装包已经被设备厂商进行了确认。

表1 OpenHarmony系统权限列表

OpenHarmony系统权限授权方式权限说明
ohos.permission.LISTEN_BUNDLE_CHANGEsystem_grant(静态权限)允许该应用获取应用变化消息。
ohos.permission.GET_BUNDLE_INFOsystem_grant(静态权限)允许该应用获取应用信息。
ohos.permission.INSTALL_BUNDLEsystem_grant(静态权限)允许该应用安装应用。
ohos.permission.CAMERAuser_grant(动态权限)此应用可随时使用相机拍摄照片和录制视频。
ohos.permission.MODIFY_AUDIO_SETTINGSsystem_grant(静态权限)允许该应用修改全局音频设置,例如音量和用于输出的扬声器。
ohos.permission.READ_MEDIAuser_grant(动态权限)允许该应用读取您的视频收藏。
ohos.permission.MICROPHONEuser_grant(动态权限)此应用可随时使用麦克风进行录音。
ohos.permission.WRITE_MEDIAuser_grant(动态权限)允许该应用写入您的音乐收藏。
ohos.permission.DISTRIBUTED_DATASYNCuser_grant(动态权限)管控分布式数据传输能力。
ohos.permission.DISTRIBUTED_VIRTUALDEVICEuser_grant(动态权限)允许应用使用分布式虚拟能力。

icon-note.gif

说明:

  1. 静态权限指应用安装时由系统授予的权限,对应于权限敏感级别的system_grant。动态权限指应用在运行过程中需要用户授权的权限,对应于权限敏感级别的user_grant。

  2. 不同应用模型的应用配置文件不同,FA模型为config.json,Stage模型为module.json5。应用模型相关解释可参考应用模型解读。

场景介绍

应用权限是软件用来访问系统资源和使用系统能力的一种通行方式。在涉及用户隐私相关功能和数据的场景,例如:访问个人设备的硬件特性,如摄像头、麦克风,以及读写媒体文件等,OpenHarmony通过应用权限管理组件来保护这些数据以及能力。

在系统应用开发过程中,如果应用要使用敏感权限,开发者可以调用应用权限管理组件接口检查待访问权限是否被授权,如果未授权,操作不允许。

接口说明

应用权限管理提供的API接口,当前仅供系统应用和系统服务调用,具体API接口如下。

表2 应用权限管理API接口功能介绍

接口名描述
int CheckPermission(int uid, const char *permissionName)检查指定UID的应用进程是否具有访问系统服务API的权限。
int CheckSelfPermission(const char *permissionName)检查调用者是否具有访问系统服务API的权限。
int QueryPermission(const char *identifier, PermissionSaved **permissions, int *permNum)查询应用申请的所有权限,并检查权限是否被授予。
int GrantPermission(const char *identifier, const char *permName)将指定权限授予应用程序。
int RevokePermission(const char *identifier, const char *permName)收回应用程序的指定权限。
int GrantRuntimePermission(int uid, const char *permissionName)应用运行时动态授予指定权限。
int RevokeRuntimePermission(int uid, const char *permissionName)应用运行时动态撤销指定权限。

开发步骤

本部分以包管理器的应用权限开发为例进行讲解。开发过程中,首先需要明确涉及的敏感权限,并在config.json中声明该权限,在安装应用程序时,包管理器会调用应用权限管理组件的接口检查该权限是否被授予,若授予,安装流程正常进行,否则安装失败。

  1. 在开发过程中,包管理器明确需要安装应用的权限(ohos.permission.INSTALL_BUNDLE),并在config.json中声明该权限。 FA模型:需要在config.json中声明权限,示例:
{
  "module": {
      "package": "ohos.demo.kitframework",
      "deviceType": [
          "phone", "tv","tablet", "car","smartWatch","sportsWatch","smartCamera", "smartVision"
      ],
      "reqPermissions": [{
        "name": "ohos.permission.INSTALL_BUNDLE",
        "reason": "install bundle",
        "usedScene": {
          "ability": [
            "KitFramework"
            ],
          "when": "always"
        }
      },
      {
        "name": "ohos.permission.LISTEN_BUNDLE_CHANGE",
        "reason": "install bundle",
        "usedScene": {
          "ability": [
            "KitFramework"
            ],
          "when": "always"
        }
      },
      {
        "name": "ohos.permission.GET_BUNDLE_INFO",
        "reason": "install bundle",
        "usedScene": {
          "ability": [
            "KitFramework"
            ],
          "when": "always"
        }
      }
    ]
  }
}

Stage模型:需要在module.json5中声明权限,示例:

{
  "module": {
    "requestPermissions": [{
      "name": "ohos.permission.INSTALL_BUNDLE",
      "reason": "install bundle",
      "usedScene": {
        "ability": [
          "KitFramework"
        ],
        "when": "always"
      }
    },
    {
      "name": "ohos.permission.LISTEN_BUNDLE_CHANGE",
      "reason": "install bundle",
      "usedScene": {
        "ability": [
          "KitFramework"
        ],
        "when": "always"
      }
    },
    {
      "name": "ohos.permission.GET_BUNDLE_INFO",
      "reason": "install bundle",
      "usedScene": {
        "ability": [
          "KitFramework"
        ],
        "when": "always"
      }
    }]
  }
}
  1. 当包管理器开发应用安装功能接口时,会调用权限管理相关接口检查自身是否具有安装应用程序的权限,例如:以安装应用的权限名"ohos.permission.INSTALL_BUNDLE"作为入参,调用CheckPermission接口检查包管理器是否具有安装应用的权限,如果有权限,安装流程继续执行,否则返回安装失败。

    constexpr static char PERMISSION_INSTALL_BUNDLE[] = "ohos.permission.INSTALL_BUNDLE";
    
    bool Install(const char *hapPath, const InstallParam *installParam, InstallerCallback installerCallback)
    {
        if ((hapPath == nullptr) || (installerCallback == nullptr) || (installParam == nullptr)) {
            HILOG_ERROR(HILOG_MODULE_APP, "BundleManager install failed due to nullptr parameters");
            return false;
        }
        // 检查ohos.permission.INSTALL_BUNDLE权限是否被授予。
        if (CheckPermission(0, static_cast<const char *>(PERMISSION_INSTALL_BUNDLE)) != GRANTED) {
            HILOG_ERROR(HILOG_MODULE_APP, "BundleManager install failed due to permission denied");
            return false;  // 返回安装失败。
        }
        // 安装流程。
        ...
    }
    
http://www.dtcms.com/a/99444.html

相关文章:

  • Redisson分布式锁深度解析:原理与实现机制
  • STM32F4单片机SDIO驱动SD卡
  • NLP语言模型训练里的特殊向量
  • Spring Boot整合Kafka详细指南(JDK 1.8)
  • Flutter环境搭建
  • JDK1.8和Maven、Git安装教程自用成功
  • 【MySQL基础】函数之字符串函数详解
  • JVM Java类加载 isInstance instanceof 的区别
  • 洛谷题单1-P5703 【深基2.例5】苹果采购-python-流程图重构
  • JDBC的详细使用
  • 【零基础入门unity游戏开发——2D篇】2D物理关节 —— Joint2D相关组件
  • [Lc4_dfs] 解数独 | 单词搜索
  • PyQt6实例_批量下载pdf工具_界面开发
  • MDK中结构体的对齐、位域、配合联合体等用法说明
  • C#:第一性原理拆解属性(property)
  • 分享一个Pyside6实现web数据展示界面的效果图
  • Springboot学习笔记3.20
  • SmolDocling文档处理模型介绍
  • Python 循环全解析:从语法到实战的进阶之路
  • 人工智能之数学基础:矩阵的相似变换的本质是什么?
  • DeepSeek网络拓扑设计解密:如何支撑千卡级AI训练的高效通信?
  • 缓存 vs 分布式锁:高并发场景下的并发控制之道
  • 【C++】类和对象(二)默认成员函数之拷贝构造函数、运算符重载、赋值运算符重载
  • <tauri><rust><GUI>基于rust和tauri,实现一个大寰电爪PGHL(串口设备)定制化控制程序
  • java pom文件加入这个可以将打包好的jar 双击运行
  • 积分赛——光敏控制多功系统设计
  • 区块链赋能,为木材货场 “智” 造未来
  • vue在线录音系统
  • Redis延时队列在订单超时未报到场景的应用补充说明
  • 利用 VSCode 配置提升 vibe coding 开发效率