• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 访问控制(权限)开发指导
2
3## 场景介绍
4
5以下示例代码基于此场景假设:应用因为应用核心功能诉求,需要申请权限"ohos.permission.PERMISSION1"和权限"ohos.permission.PERMISSION2"。
6
7- 应用的APL等级为normal。
8- 权限"ohos.permission.PERMISSION1"的权限等级为normal,权限类型为system_grant。
9- 权限"ohos.permission.PERMISSION2"的权限等级为system_basic, 权限类型为user_grant。
10
11> **注意事项:**
12>
13> 当前场景下,应用申请的权限包括了user_grant权限,对这部分user_grant权限,可以先通过权限校验,判断当前调用者是否具备相应权限。
14>
15> 当权限校验结果显示当前应用尚未被授权该权限时,再通过动态弹框授权方式给用户提供手动授权入口。
16>
17## 接口说明
18
19以下仅列举本指导使用的接口,更多说明可以查阅[API参考](../reference/apis/js-apis-abilityAccessCtrl.md)。
20
21| 接口名                                                       | 描述                                             |
22| ------------------------------------------------------------ | --------------------------------------------------- |
23| verifyAccessToken(tokenID: number, permissionName: string): Promise<GrantStatus> | 校验应用是否授予权限,使用Promise方式异步返回结果。 |
24
25## 权限申请声明
26
27### config.json文件声明
28
29应用需要在config.json文件中对需要的权限逐个进行声明。没有在config.json中声明的权限,应用无法获得此应用授权。
30
31**config.json标签说明:**
32
33| 标签      | 说明                                                         |
34| --------- | ------------------------------------------------------------ |
35| name      | 权限名称。                                                   |
36| reason    | 当申请的权限为user_grant权限时,此字段必填,描述申请权限的原因。 |
37| usedScene | 当申请的权限为user_grant权限时,此字段必填,描述权限使用的场景和时机。 |
38| ability | 标识需要使用到该权限的元能力,标签为数组形式。               |
39| when      | 标识权限使用的时机,值为"inuse/always",表示为仅允许前台使用和前后台都可使用。 |
40
41**示例:**
42
43```json
44{
45    "module" : {
46        "reqPermissions":[
47           {
48                "name" : "ohos.permission.PERMISSION1",
49                "reason": "$string:reason",
50                "usedScene": {
51                     "ability": [
52                         "FormAbility"
53                     ],
54                     "when":"inuse"
55                }
56            },
57           {
58                "name" : "ohos.permission.PERMISSION2",
59                "reason": "$string:reason",
60                "usedScene": {
61                     "ability": [
62                         "FormAbility"
63                     ],
64                     "when":"always"
65                }
66            }
67        ],
68    }
69}
70```
71## ACL方式声明
72
73如上述示例所示,权限"ohos.permission.PERMISSION2"的权限等级为system_basic,高于应用此时应用的APL等级,用户的最佳做法是使用ACL方式。
74
75config.json文件声明的基础上,应用还需要在profile文件中声明不满足申请条件部分的权限。该场景中,用户应该在字段"acls"中做声明如下:
76```json
77{
78    "version-name": "1.0.0",
79    "version-code": 1,
80    "app-distribution-type": "os_integration",
81    "uuid": "5027b99e-5f9e-465d-9508-a9e0134ffe18",
82    "validity": {
83        "not-before": 1594865258,
84        "not-after": 1689473258
85    },
86    "type": "release",
87    "bundle-info": {
88        "developer-id": "OpenHarmony",
89        "distribution-certificate": "-----BEGIN CERTIFICATE-----\nMIICMzCCAbegAwIBAgIEaOC/zDAMBggqhkjOPQQDAwUAMGMxCzAJBgNVBAYTAkNO\nMRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkgVGVh\nbTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjEwMjAy\nMTIxOTMxWhcNNDkxMjMxMTIxOTMxWjBoMQswCQYDVQQGEwJDTjEUMBIGA1UEChML\nT3Blbkhhcm1vbnkxGTAXBgNVBAsTEE9wZW5IYXJtb255IFRlYW0xKDAmBgNVBAMT\nH09wZW5IYXJtb255IEFwcGxpY2F0aW9uIFJlbGVhc2UwWTATBgcqhkjOPQIBBggq\nhkjOPQMBBwNCAATbYOCQQpW5fdkYHN45v0X3AHax12jPBdEDosFRIZ1eXmxOYzSG\nJwMfsHhUU90E8lI0TXYZnNmgM1sovubeQqATo1IwUDAfBgNVHSMEGDAWgBTbhrci\nFtULoUu33SV7ufEFfaItRzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFPtxruhl\ncRBQsJdwcZqLu9oNUVgaMAwGCCqGSM49BAMDBQADaAAwZQIxAJta0PQ2p4DIu/ps\nLMdLCDgQ5UH1l0B4PGhBlMgdi2zf8nk9spazEQI/0XNwpft8QAIwHSuA2WelVi/o\nzAlF08DnbJrOOtOnQq5wHOPlDYB4OtUzOYJk9scotrEnJxJzGsh/\n-----END CERTIFICATE-----\n",
90        "bundle-name": "com.ohos.permissionmanager",
91		"apl": "system_core",
92        "app-feature": "hos_system_app"
93    },
94    "acls": {
95        "allowed-acls": [
96            "ohos.permission.PERMISSION2"
97        ]
98    },
99    "permissions": {
100        "restricted-permissions": []
101    },
102    "issuer": "pki_internal"
103}
104```
105
106## 申请授权user_grant权限
107
108在前期的权限声明步骤后,在安装过程中系统会对system_grant类型的权限进行权限预授权,而user_grant类型权限则需要用户进行手动授权。
109
110所以,应用在调用受"ohos.permission.PERMISSION2"权限保护的接口前,需要先校验应用是否已经获取该权限。
111
112如果校验结果显示,应用已经获取了该权限,那么应用可以直接访问该目标接口,否则,应用需要通过动态弹框先申请用户授权,并根据授权结果进行相应处理,处理方式可参考[访问控制开发概述](accesstoken-overview.md)。
113
114> **注意事项:**
115>
116> 不能把之前授予的状态持久化,每次访问受目标权限保护的接口前,都应该检查权限授权状态,因为用户在动态授予后可能通过设置取消应用的权限。
117
118## 完整示例
119
120对访问者进行权限校验的开发步骤为:
121
1221. 获取ability的上下文context。
1232. 调用requestPermissionsFromUser接口进行权限校验。
1243. 根据权限校验结果采取对应的措施。
125
126```js
127import featureAbility from '@ohos.ability.featureAbility';
128
129onStart() {
130    var context = featureAbility.getContext()
131    let array:Array<string> = ["ohos.permission.PERMISSION2"];
132    //requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
133    context.requestPermissionsFromUser(array, 1, (err, data)=>{
134        console.info("====>requestdata====>" + JSON.stringify(data));
135        console.info("====>requesterrcode====>" + JSON.stringify(err.code));
136  })
137}
138```
139> **说明:**
140> 动态授权申请接口的使用详见[API参考](../reference/apis/js-apis-ability-context.md)。
141
142## 相关实例
143
144针对访问控制,有以下相关实例可供参考:
145
146- [`AbilityAccessCtrl`:访问权限控制(eTS)(API8)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/samples_monthly_0730/Safety/AbilityAccessCtrl)