Ability Kit 提供了一種允許應用訪問系統資源(如:通訊錄等)和系統能力(如:訪問攝像頭、麥克風等)的通用權限訪問方式,來保護系統數據(包括用戶個人數據)或功能,避免它們被不當或惡意使用。
應用權限保護的對象可以分為數據和功能:
- 數據 包括個人數據(如照片、通訊錄、日歷、位置等)、設備數據(如設備標識、相機、麥克風等)。
- 功能 包括設備功能(如訪問攝像頭/麥克風、打電話、聯網等)、應用功能(如彈出懸浮窗、創建快捷方式等)。
系統采用 TokenID 作為應用的唯一標識。權限管理服務通過應用的 TokenID 來管理應用的 AT(Access Token)信息,包括應用身份標識 APP ID、子用戶 ID、應用分身索引信息、應用 APL、應用權限授權狀態等。在資源使用時,系統將通過 TokenID 作為唯一身份標識映射獲取對應應用的權限授權狀態信息,并依此進行鑒權,從而管控應用的資源訪問行為。
系統支持多用戶特性和應用分身特性,同一個應用在不同的子用戶下和不同的應用分身下會有各自的 AT,這些 AT 的 TokenID 也是不同的。
授權方式
-
system_grant
(系統授權)
在該類型的權限許可下,應用被允許訪問的數據不會涉及到用戶或設備的敏感信息,應用被允許執行的操作對系統或者其他應用產生的影響可控。
如果在應用中申請了 system_grant 權限,那么系統會在用戶安裝應用時,自動把相應權限授予給應用。配置文件(module.json5)申請權限 -
user_grant
(用戶授權)
在該類型的權限許可下,應用被允許訪問的數據將會涉及到用戶或設備的敏感信息,應用被允許執行的操作可能對系統或者其他應用產生嚴重的影響。
該類型權限不僅需要在安裝包中申請權限,還需要在應用動態運行時,通過發送彈窗的方式請求用戶授權。在用戶手動允許授權后,應用才會真正獲取相應權限,從而成功訪問操作目標對象。配置文件申請權限 + 運行時彈窗請求授權
常見權限
常見 系統授權 權限
權限 | 描述 |
---|---|
ohos.permission.INTERNET | 允許使用網絡資源 |
ohos.permission.KEEP_BACKGROUND_RUNNING | 允許 Ability 在后臺持續運行 |
ohos.permission.USE_BLUETOOTH | 允許應用查看藍牙的配置 |
ohos.permission.PRINT | 允許應用獲取打印框架的能力 |
ohos.permission.ACCELEROMETER | 允許應用讀取加速度傳感器的數據 |
ohos.permission.VIBRATE | 允許應用控制馬達振動 |
常見 用戶授權 權限
權限 | 描述 |
---|---|
ohos.permission.APP_TRACKING_CONSENT | 允許應用讀取開放匿名設備標識符 |
ohos.permission.CAMERA | 允許應用使用相機 |
ohos.permission.DISTRIBUTED_DATASYNC | 允許不同設備間的數據交換 |
ohos.permission.APPROXIMATELY_LOCATION | 允許應用獲取設備模糊位置信息 |
ohos.permission.LOCATION | 允許應用獲取設備位置信息 |
ohos.permission.WRITE_MEDIA | 允許應用讀寫用戶外部存儲中的媒體文件信息 |
配置文件授權
用在申請權限時,需要在項目的配置文件(module.json5
)中,逐個聲明需要的權限,否則應用將無法獲取授權:
{"module": {"requestPermissions": [{"name": "ohos.permission.PERMISSION_NAME", //所有權限都必須聲明權限名稱"reason": "$string:reason", //申請原因,user_grant 權限必需"usedScene": {//使用場景,user_grant 權限必需"abilities": ["EntryAbility"], //哪些UIAbility中使用"when": "inuse" //何時使用}}]}
}
向用戶申請授權
當應用需要訪問用戶的隱私信息或使用系統能力時,例如獲取位置信息、訪問日歷、使用相機拍攝照片或錄制視頻等,應該向用戶請求授權,這部分權限是 user_grant
權限。
當應用申請 user_grant
權限時,需要完成以下步驟:
- 在配置文件(module.json5)中,聲明應用需要請求的權限。
- 將應用中需要申請權限的目標對象與對應目標權限進行關聯,讓用戶明確地知道,哪些操作需要用戶向應用授予指定的權限。
- 運行應用時,在用戶觸發訪問操作目標對象時應該調用接口,精準觸發動態授權彈框。該接口的內部會檢查當前用戶是否已經授權應用所需的權限,如果當前用戶尚未授予應用所需的權限,該接口會拉起動態授權彈框,向用戶請求授權。
- 檢查用戶的授權結果,確認用戶已授權才可以進行下一步操作。
每次執行需要目標權限的操作時,應用都必須使用
checkAccessToken()
函數檢查自己是否已經具有該權限
每次訪問受目標權限保護的接口之前,都需要使用requestPermissionsFromUser()
接口請求相應的權限
// 下面的代碼可以運行在 Ability 啟動時,或者某個 UI頁面 啟動時
import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit'async checkPermissions() {let permissions: Permissions[] = ["ohos.permission.CAMERA"]let accessMgr = abilityAccessCtrl.createAtManager()const flags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION;const bundleInfo = await bundleManager.getBundleInfoForSelf(flags)const grantStatus =await accessMgr.checkAccessToken(bundleInfo.appInfo.accessTokenId, permissions[0])if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {let results = await accessMgr.requestPermissionsFromUser(getContext(), permissions)if (results.authResults[0] == 0) {// 用戶通過授權} else {// 用戶拒絕授權}}}