首页 > 其他分享 >权限管理,鸿蒙Next版

权限管理,鸿蒙Next版

时间:2024-06-01 15:29:59浏览次数:25  
标签:const 鸿蒙 permission grant Next 应用 授权 权限

  一、应用权限概述

注意事项

在鸿蒙开发中,调用部分 API 时需要申请权限后,才能调用,如:网络请求,获取网络信息等。

部分 API 权限调用的时候还会弹窗,如:麦克风、位置、摄像头、相册、传感器(sensor)、日历等。

申请应用权限时,需要注意两个关键信息:

  1. 权限级别
  2. 授权方式

权限文档截图 

 

 

应用权限级别

系统根据应用的APL等级设置进程域和数据域标签,并通过访问控制机制限制应用可访问的数据范围,从而实现在机制上消减应用数据泄露的风险。

不同APL等级的应用能够申请的权限等级不同,且不同的系统资源(如:通讯录等)或系统能力(如:访问摄像头、麦克风等)受不同的应用权限保护。通过严格的分层权限保护,有效抵御恶意攻击,确保系统安全可靠。

应用权限管控的详细介绍,请参考应用权限管控概述

应用APL等级

应用的等级可以分为以下三个等级,等级依次提高。

APL级别

说明

大白话

normal

默认情况下,应用的APL等级都为normal等级。

都能用

system_basic

该等级的应用服务提供系统基础服务。

要签名证书

system_core

该等级的应用服务提供操作系统核心能力。

仅对系统应用开放

不开放

 授权方式概述

根据授权方式的不同,权限类型可分为 system_grant 和 user_grant。

大白话:授权方式为 user_grant 会弹窗,而 system_grant 自动授权。

system_grant(系统授权)

system_grant指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。

如果在应用中申请了system_grant 权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。

user_grant(用户授权)

user_grant指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。

该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。

申请 user_grant 用户授权

权限管理封装

由于 检查授权,动态申请授权,处理授权结果 逻辑都是相同的,我们通过 class 类把功能封装,方便复用。

基本结构
import { Permissions } from '@kit.AbilityKit';

class PermissionManager {

  // 检查是否授权
  checkPermissions(permissions: Permissions[]) {

  }

  // 动态申请授权(首次弹窗申请)
  async requestPermissions(permissions: Permissions[]) {

  }

  // 打开系统设置的权限管理页(处理授权结果)
  openPermissionSettingsPage() {

  }
}

// 导出 Manager
export const permissionManager = new PermissionManager()
封装参考
import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';

class PermissionManager {

  // 检查是否授权
  checkPermissions(permissions: Permissions[]) {
    // 程序访问控制管理
    const atManager = abilityAccessCtrl.createAtManager();
    // 获取 bundle 信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    // 提取 tokenID 标识
    const tokenID = bundleInfo.appInfo.accessTokenId
    // 校验应用是否被授予权限
    const authResults = permissions.map((item) => atManager.checkAccessTokenSync(tokenID, item))
    // 返回是否已授权结果
    return authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  }

  // 动态申请授权(首次弹窗申请)
  async requestPermissions(permissions: Permissions[]) {
    // 程序访问控制管理
    const atManager = abilityAccessCtrl.createAtManager();
    // 拉起弹框请求用户授权
    const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissions)
    // 获取请求权限的结果
    const isAuth = grantStatus.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    // 返回 Promise 授权结果
    return isAuth ? Promise.resolve(true) : Promise.reject(false)
  }

  // 打开系统设置的权限管理页(处理授权结果)
  openPermissionSettingsPage() {
    // 获取上下文
    const context = getContext() as common.UIAbilityContext
    // 获取包信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    // 打开系统设置页
    context.startAbility({
      bundleName: 'com.huawei.hmos.settings',
      abilityName: 'com.huawei.hmos.settings.MainAbility',
      uri: 'application_info_entry',
      parameters: {
        // 按照包名打开对应设置页
        pushParams: bundleInfo.name
      }
    })
  }
}

export const permissionManager = new PermissionManager()

跨级别申请的权限

跨级别权限常见问题

在 module.json5 文件中,如果添加的权限为 ACL使能:true,在编译时会报错,如:通讯录、照片。

  • ohos.permission.READ_CONTACTS
  • ohos.permission.WRITE_CONTACTS
  • ohos.permission.READ_IMAGEVIDEO
  • ohos.permission.WRITE_IMAGEVIDEO

ACL权限

  • 访问控制列表ACL(Access Control List)提供了解决低等级应用访问高等级权限问题的特殊渠道。
  • 从 DevEco Studio 4.0 Release 版本起,支持在调测阶段自动签名快速申请ACL权限

API版本(compileSdkVersion)

支持的ACL权限

API Version > 10

  • ohos.permission.READ_CONTACTS
  • ohos.permission.WRITE_CONTACTS
  • ohos.permission.READ_AUDIO
  • ohos.permission.WRITE_AUDIO
  • ohos.permission.READ_IMAGEVIDEO
  • ohos.permission.WRITE_IMAGEVIDEO
  • ohos.permission.SYSTEM_FLOAT_WINDOW
  • ohos.permission.READ_PASTEBOARD
  • ohos.permission.ACCESS_DDK_USB
  • ohos.permission.ACCESS_DDK_HID

自动签名步骤

  1. 确保已连接真机或模拟器。

 

2.登录华为帐号后,勾选“Automatically generate signature”,即可完成签名。

 

温馨提示

项目要上线时,调用 ACL 权限需要手动签名,生成密钥和证书请求文件。

由于流程和步骤较多,在后续文章中再补充。

当下先使用自动签名方式调用 ACL 权限。

  1. 在 module.json5 中添加权限
{
  "module": {
    "requestPermissions": [
      // ...
      // 通讯录
      {
        "name": "ohos.permission.READ_CONTACTS",
        "reason": '$string:permission_reason_contact',
        "usedScene": {}
      },
      {
        "name": "ohos.permission.WRITE_CONTACTS",
        "reason": '$string:permission_reason_contact',
        "usedScene": {}
      },
      // 照片
      {
        "name": "ohos.permission.READ_IMAGEVIDEO",
        "reason": "$string:permission_reason_imageVideo",
        "usedScene": {}
      },
      {
        "name": "ohos.permission.WRITE_IMAGEVIDEO",
        "reason": "$string:permission_reason_imageVideo",
        "usedScene": {}
      },
    ],
  }
}

2.添加 reason 权限使用理由。

  1. 当申请的权限为 user_grant 权限时必填,并且需要进行多语种适配。
  2. 参考句式:用于某事,如:(麦克风)用于录制加密视频和音频。

 

标签:const,鸿蒙,permission,grant,Next,应用,授权,权限
From: https://blog.csdn.net/xp1870069025/article/details/139370303

相关文章

  • 【JavaScript脚本宇宙】从i18next到Date-fns:国际化和本地化库
    跨越JavaScript新境界:六大库全面评测前言本文将详细介绍六种具有不同功能的JavaScript库,包括处理多语言支持、全球化和本地化、格式化日期、数字和字符串,解析、验证、操作、显示日期和时间,格式化和操作数字,以及最全面、最简单和一致的工具集用于处理JavaScript中的日期等......
  • 解锁数组操作的艺术:你的终极方法集指南(鸿蒙篇)
    数组在编程中扮演着重要的角色,它们允许我们存储和操作一系列的元素。以下是对数组操作方法的全面介绍:Array.concat()concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。constarray1=['a','b','c'];constarray2=['d','e','f'];......
  • vue3 组件级权限控制
    权限控制程度分为:1.页面级2.组件级3.代码级1.页面级这是大部分前端遇到的级别。依靠路由守卫,如果没有权限,就看不到菜单,就进不到页面。不会给页面带来侵入性。什么是侵入性,就是写页面组件的时候,还要考虑权限。2.组件级有没有权限都可以看到页面组件,但是不同权限的人,......
  • 【LINUX】LINUX基础(目录结构、基本权限、基本命令)
    文章目录LINUX的目录结构LINUX的基本权限LINUX基本命令LINUX的目录结构/:表示根目录bin:存放二进制可执行文件(命令ls、cat、mkdir等)boot:存放系统引导文件dev:存放设备文件etc:存放系统配置文件home:存放当前用户的文件(~表示当前用户默认目录、…则是上一级目录、-表......
  • linux修改某类文件权限命令
    bashfind/your/directory-typef-name"*.so*"!-typel-execchmod644{}+这条命令会在/your/directory目录下递归查找所有文件名以.so结尾的文件(共享库文件),并将它们的权限设置为644。!-typel部分确保只有实际的文件(不是符号链接)会被修改权限。请替换/your/......
  • 鸿蒙HarmonyOS实战-Web组件(Cookie及数据存储)
    ......
  • 鸿蒙开发的知识点(ArkTS阶段)(一)
    1、ArkTS常见的数据类型有哪些?        ①为什么要有数据类型        例子:在烹饪中,我们需要知道食材的种类(如蔬菜、肉类等)和数量(如1个苹果、200克鸡肉等)。如果我们不区分这些食材的种类和数量,那么在做菜时就会遇到问题。例如,如 果我们将所有食材都......
  • SpringSecurity权限验证
    目录我们先用默认的一个访问拦截页面第二种,我们可以自己写一个登录的页面,也就是没有权限被拦截之后的登录页面我们先用默认的一个访问拦截页面首先先加入我们的Security的一个依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>s......
  • 【最新鸿蒙应用开发】——优化之从启动和响应速度作为思路
    优化--提升应用启动速度和响应速度从应用程序启动和运行过程的思路来思考,比如想办法提升冷启动速度,使用并行化(多线程并发,异步并发)、预加载、缓存等方法手段,提升系统资源利用率,减少主线程负载,加快应用的响应速度。以下是一些详细细节的总结。1、提升应用冷启动速度应用启动......
  • 鸿蒙HarmonyOS实战-Web组件(页面跳转和浏览记录)
    ......