跳转到内容
Tauri

访问控制列表

每个 Tauri 命令都向 JavaScript 层公开一个 Rust 函数,该函数可以使用操作系统 API 执行任意操作,默认情况下,该层使用 Web 标准进行沙箱化。 如果攻击者可以执行访问 Tauri 命令的代码,这将给您的应用程序带来风险。

为了缓解这种情况,Tauri 使用访问控制列表(Access Control List;ACL)来限制插件命令的访问。默认情况下,所有插件命令都被阻止,无法访问。若要启用对应用程序所需命令的访问,必须定义需要访问的权限列表。

功能

功能将权限集合与相关的窗口列表进行分组,以便您可以对单窗口和多窗口应用程序配置访问控制。

您可以将功能定义为 src-tauri/capabilities 目录中的 JSON 或 TOML 文件。

下面的 JSON 定义了一个功能,该功能为核心插件和 window.setTitle API启用默认功能。

"src-tauri/capabilities/main.json
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "main-capability",
"description": "Capability for the main window",
"windows": ["main"],
"permissions": [
"path:default",
"event:default",
"window:default",
"app:default",
"resources:default",
"menu:default",
"tray:default",
"window:allow-set-title"
]
}

目标平台

通过定义 platforms 数组,功能可以是特定于平台的。 默认情况下,该功能适用于所有目标,但您可以选择 linux、macOS、windows、iOS 和 android 目标的一部分。

例如,让我们为桌面定义一个功能。注意,它启用了只能在桌面端使用的插件权限:

"src-tauri/capabilities/desktop.json
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "desktop-capability",
"windows": ["main"],
"platforms": ["linux", "macOS", "windows"],
"permissions": ["global-shortcut:allow-register"]
}

并定义移动能力。注意,它启用了只能在移动设备上使用的插件的权限:

"src-tauri/capabilities/mobile.json
{
"$schema": "../gen/schemas/mobile-schema.json",
"identifier": "mobile-capability",
"windows": ["main"],
"platforms": ["iOS", "android"],
"permissions": [
"nfc:allow-scan",
"biometric:allow-authenticate",
"barcode-scanner:allow-scan"
]
}

JSON 模式

Tauri 生成一个 JSON 模式,包含应用程序可用的所有权限,这样你就可以在 IDE 中实现自动补全。 要使用模式,请将 $schema 属性设置为 capabilities/schemas 目录中的模式之一,这些模式是特定于平台的。 通常你会将其设置为 ../gen/schemas/desktop-schema.json../gen/schemas/mobile-schema.json,不过你也可以为特定的目标平台定义功能。

在上面的示例中,我们为桌面端和移动端定义了特定的功能,并引用了相关的 JSON 模式。让我们定义一个仅适用于 Linux 的功能:

"src-tauri/capabilities/linux.json
{
"$schema": "../gen/schemas/linux-schema.json",
"identifier": "linux-capability",
"windows": ["main"],
"platforms": ["iOS", "android"],
"permissions": ["dbus::call"]
}

多窗口

windows 属性定义了应该引用权限列表的窗口列表。您可以使用通配模式来引用动态窗口标签。

下面的示例将该功能与 main 窗口和任何以 editor- 为前缀的标签窗口连接起来。

"src-tauri/capabilities/mobile.json
{
"windows": ["main", "editor-*"],
"permissions": [
...
]
}

作用域

作用域进一步限制命令。它们的格式是特定于插件的,但是 Tauri 提供了允许和拒绝某些命令操作的原语,通常限制命令输入。 例如,fs 插件允许你使用作用域来允许或拒绝某些目录和文件,http 插件使用作用域来过滤允许访问的 url。

让我们研究一些官方插件的例子:

  • 允许任何 fs 命令访问应用程序数据目录:
"src-tauri/capabilities/base.json
{
"permissions": [
{
"identifier": "fs:scope",
"allow": [{ "path": "$APPDATA" }, { "path": "$APPDATA/**" }]
}
]
}
  • 允许 fs rename 命令访问主目录:
"src-tauri/capabilities/base.json
{
"permissions": [
{
"identifier": "fs:allow-rename",
"allow": [{ "path": "$HOME/**" }]
}
]
}
  • 配置 http 插件的作用域:
"src-tauri/capabilities/base.json
{
"permissions": [
{
"identifier": "http:default",
"allow": [{ "url": "https://*.tauri.app" }],
"deny": [{ "url": "https://private.tauri.app" }]
}
]
}

远程访问

默认情况下,每个功能只适用于应用程序的嵌入式内容(无论是你的 devUrl 还是 frontendDist 前端)。 如果你想允许远程 URL 访问 Tauri 命令(这很危险,需要仔细配置),你可以使用 context 属性。

在下面的例子中,我们将该功能与任何 tauri.app 子域名关联。

"src-tauri/capabilities/remote.json
{
"remote": {
"urls": ["https://*.tauri.app"]
},
"local": false,
"permissions": [
...
]
}

© 2024 Tauri Contributors. CC-BY / MIT