Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
a244185a
D
Docs
项目概览
OpenHarmony
/
Docs
1 年多 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
a244185a
编写于
8月 25, 2023
作者:
O
openharmony_ci
提交者:
Gitee
8月 25, 2023
浏览文件
操作
浏览文件
下载
差异文件
!23011 访问控制指南ArkTS告警整改-monthly挑单
Merge pull request !23011 from zhouyan/monthly
上级
c934963a
a7dcf765
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
115 addition
and
62 deletion
+115
-62
zh-cn/application-dev/security/accesstoken-guidelines.md
zh-cn/application-dev/security/accesstoken-guidelines.md
+115
-62
未找到文件。
zh-cn/application-dev/security/accesstoken-guidelines.md
浏览文件 @
a244185a
...
...
@@ -170,9 +170,10 @@
在进行权限申请之前,需要先检查当前应用程序是否已经被授予了权限。可以通过调用
[
checkAccessToken()
](
../reference/apis/js-apis-abilityAccessCtrl.md#checkaccesstoken9
)
方法来校验当前是否已经授权。如果已经授权,则可以直接访问目标操作,否则需要进行下一步操作,即向用户申请授权。
```
t
s
```
t
ypescript
import
bundleManager
from
'
@ohos.bundle.bundleManager
'
;
import
abilityAccessCtrl
,
{
Permissions
}
from
'
@ohos.abilityAccessCtrl
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
async
function
checkAccessToken
(
permission
:
Permissions
):
Promise
<
abilityAccessCtrl
.
GrantStatus
>
{
let
atManager
=
abilityAccessCtrl
.
createAtManager
();
...
...
@@ -184,14 +185,16 @@
let
bundleInfo
:
bundleManager
.
BundleInfo
=
await
bundleManager
.
getBundleInfoForSelf
(
bundleManager
.
BundleFlag
.
GET_BUNDLE_INFO_WITH_APPLICATION
);
let
appInfo
:
bundleManager
.
ApplicationInfo
=
bundleInfo
.
appInfo
;
tokenId
=
appInfo
.
accessTokenId
;
}
catch
(
err
)
{
}
catch
(
error
)
{
let
err
:
BusinessError
=
error
as
BusinessError
;
console
.
error
(
`Failed to get bundle info for self. Code is
${
err
.
code
}
, message is
${
err
.
message
}
`
);
}
// 校验应用是否被授予权限
try
{
grantStatus
=
await
atManager
.
checkAccessToken
(
tokenId
,
permission
);
}
catch
(
err
)
{
}
catch
(
error
)
{
let
err
:
BusinessError
=
error
as
BusinessError
;
console
.
error
(
`Failed to check access token. Code is
${
err
.
code
}
, message is
${
err
.
message
}
`
);
}
...
...
@@ -222,35 +225,34 @@
import
UIAbility
from
'
@ohos.app.ability.UIAbility
'
;
import
window
from
'
@ohos.window
'
;
import
abilityAccessCtrl
,
{
Permissions
}
from
'
@ohos.abilityAccessCtrl
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
const
permissions
:
Array
<
Permissions
>
=
[
'
ohos.permission.READ_CALENDAR
'
];
export
default
class
EntryAbility
extends
UIAbility
{
// ...
onWindowStageCreate
(
windowStage
:
window
.
WindowStage
)
{
// Main window is created, set main page for this ability
let
context
=
this
.
context
;
let
atManager
=
abilityAccessCtrl
.
createAtManager
();
// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
atManager
.
requestPermissionsFromUser
(
context
,
permissions
).
then
((
data
)
=>
{
let
grantStatus
:
Array
<
number
>
=
data
.
authResults
;
let
length
:
number
=
grantStatus
.
length
;
for
(
let
i
=
0
;
i
<
length
;
i
++
)
{
if
(
grantStatus
[
i
]
===
0
)
{
// 用户授权,可以继续访问目标操作
}
else
{
// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
return
;
}
}
// 授权成功
}).
catch
((
err
)
=>
{
console
.
error
(
`Failed to request permissions from user. Code is
${
err
.
code
}
, message is
${
err
.
message
}
`
);
})
// ...
}
// ...
onWindowStageCreate
(
windowStage
:
window
.
WindowStage
)
{
// Main window is created, set main page for this ability
let
context
=
this
.
context
;
let
atManager
=
abilityAccessCtrl
.
createAtManager
();
// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
atManager
.
requestPermissionsFromUser
(
context
,
permissions
).
then
((
data
)
=>
{
let
grantStatus
:
Array
<
number
>
=
data
.
authResults
;
let
length
:
number
=
grantStatus
.
length
;
for
(
let
i
=
0
;
i
<
length
;
i
++
)
{
if
(
grantStatus
[
i
]
===
0
)
{
// 用户授权,可以继续访问目标操作
}
else
{
// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
return
;
}
}
// 授权成功
}).
catch
((
err
:
BusinessError
)
=>
{
console
.
error
(
`Failed to request permissions from user. Code is
${
err
.
code
}
, message is
${
err
.
message
}
`
);
})
// ...
}
}
```
...
...
@@ -259,37 +261,38 @@
```
typescript
import
abilityAccessCtrl
,
{
Permissions
}
from
'
@ohos.abilityAccessCtrl
'
;
import
common
from
'
@ohos.app.ability.common
'
;
import
{
BusinessError
}
from
'
@ohos.base
'
;
const
permissions
:
Array
<
Permissions
>
=
[
'
ohos.permission.READ_CALENDAR
'
];
@
Entry
@
Component
struct
Index
{
reqPermissionsFromUser
(
permissions
:
Array
<
Permissions
>
):
void
{
let
context
=
getContext
(
this
)
as
common
.
UIAbilityContext
;
let
atManager
=
abilityAccessCtrl
.
createAtManager
();
// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
atManager
.
requestPermissionsFromUser
(
context
,
permissions
).
then
((
data
)
=>
{
let
grantStatus
:
Array
<
number
>
=
data
.
authResults
;
let
length
:
number
=
grantStatus
.
length
;
for
(
let
i
=
0
;
i
<
length
;
i
++
)
{
if
(
grantStatus
[
i
]
===
0
)
{
// 用户授权,可以继续访问目标操作
}
else
{
// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
return
;
}
}
// 授权成功
}).
catch
((
er
r
)
=>
{
console
.
error
(
`Failed to request permissions from user. Code is
${
err
.
code
}
, message is
${
err
.
message
}
`
);
})
}
// 页面展示
build
()
{
// ...
}
reqPermissionsFromUser
(
permissions
:
Array
<
Permissions
>
):
void
{
let
context
=
getContext
(
this
)
as
common
.
UIAbilityContext
;
let
atManager
=
abilityAccessCtrl
.
createAtManager
();
// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
atManager
.
requestPermissionsFromUser
(
context
,
permissions
).
then
((
data
)
=>
{
let
grantStatus
:
Array
<
number
>
=
data
.
authResults
;
let
length
:
number
=
grantStatus
.
length
;
for
(
let
i
=
0
;
i
<
length
;
i
++
)
{
if
(
grantStatus
[
i
]
===
0
)
{
// 用户授权,可以继续访问目标操作
}
else
{
// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
return
;
}
}
// 授权成功
}).
catch
((
err
:
BusinessErro
r
)
=>
{
console
.
error
(
`Failed to request permissions from user. Code is
${
err
.
code
}
, message is
${
err
.
message
}
`
);
})
}
// 页面展示
build
()
{
// ...
}
}
```
...
...
@@ -297,10 +300,59 @@
调用
[
requestPermissionsFromUser()
](
../reference/apis/js-apis-abilityAccessCtrl.md#requestpermissionsfromuser9
)
方法后,应用程序将等待用户授权的结果。如果用户授权,则可以继续访问目标操作。如果用户拒绝授权,则需要提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限。
```
ts
ArkTS语法不支持直接使用globalThis,需要通过一个单例的map来做中转。开发者需要:
a. 在EntryAbility.ets中导入构建的单例对象GlobalThis。
```
typescript
import
{
GlobalThis
}
from
'
../utils/globalThis
'
;
// 需要根据globalThis.ets的路径自行适配
```
b. 在onCreate中添加:
```
typescript
GlobalThis
.
getInstance
().
setContext
(
'
context
'
,
this
.
context
);
```
> **说明:**
>
> 由于在ts中引入ets文件会有告警提示,需要将EntryAbility.ts的文件后缀修改为EntryAbility.ets,并在module.json5中同步修改。
**globalThis.ets示例代码如下:**
```
typescript
import
common
from
'
@ohos.app.ability.common
'
;
// 构造单例对象
export
class
GlobalThis
{
private
constructor
()
{}
private
static
instance
:
GlobalThis
;
private
_uiContexts
=
new
Map
<
string
,
common
.
UIAbilityContext
>
();
public
static
getInstance
():
GlobalThis
{
if
(
!
GlobalThis
.
instance
)
{
GlobalThis
.
instance
=
new
GlobalThis
();
}
return
GlobalThis
.
instance
;
}
getContext
(
key
:
string
):
common
.
UIAbilityContext
|
undefined
{
return
this
.
_uiContexts
.
get
(
key
);
}
setContext
(
key
:
string
,
value
:
common
.
UIAbilityContext
):
void
{
this
.
_uiContexts
.
set
(
key
,
value
);
}
// 其他需要传递的内容依此扩展
}
```
```
typescript
import
{
BusinessError
}
from
'
@ohos.base
'
;
import
Want
from
'
@ohos.app.ability.Want
'
;
import
{
GlobalThis
}
from
'
../utils/globalThis
'
;
import
common
from
'
@ohos.app.ability.common
'
;
function
openPermissionsInSystemSettings
():
void
{
let
context
=
getContext
(
this
)
as
common
.
UIAbilityContext
;
let
wantInfo
=
{
let
context
:
common
.
UIAbilityContext
=
GlobalThis
.
getInstance
().
getContext
(
'
context
'
)
;
let
wantInfo
:
Want
=
{
action
:
'
action.settings.app.info
'
,
parameters
:
{
settingsParamBundleName
:
'
com.example.myapplication
'
// 打开指定应用的详情页面
...
...
@@ -308,7 +360,7 @@
}
context
.
startAbility
(
wantInfo
).
then
(()
=>
{
// ...
}).
catch
((
err
)
=>
{
}).
catch
((
err
:
BusinessError
)
=>
{
// ...
})
}
...
...
@@ -319,6 +371,7 @@
通过调用
[
requestPermissionsFromUser()
](
../reference/apis/js-apis-inner-app-context.md#contextrequestpermissionsfromuser7
)
接口向用户动态申请授权。
```
js
import
{
BusinessError
}
from
'
@ohos.base
'
;
import
featureAbility
from
'
@ohos.ability.featureAbility
'
;
reqPermissions
()
{
...
...
@@ -329,7 +382,7 @@ reqPermissions() {
console
.
log
(
"
data:
"
+
JSON
.
stringify
(
data
));
console
.
log
(
"
data permissions:
"
+
JSON
.
stringify
(
data
.
permissions
));
console
.
log
(
"
data result:
"
+
JSON
.
stringify
(
data
.
authResults
));
},
(
err
)
=>
{
},
(
err
:
BusinessError
)
=>
{
console
.
error
(
'
Failed to start ability
'
,
err
.
code
);
});
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录