访问控制列表
每个 Tauri 命令都向 JavaScript 层公开一个 Rust 函数,该函数可以使用操作系统 API 执行任意操作,默认情况下,该层使用 Web 标准进行沙箱化。 如果攻击者可以执行访问 Tauri 命令的代码,这将给您的应用程序带来风险。
为了缓解这种情况,Tauri 使用访问控制列表(Access Control List;ACL)来限制插件命令的访问。默认情况下,所有插件命令都被阻止,无法访问。若要启用对应用程序所需命令的访问,必须定义需要访问的权限列表。
功能
功能将权限集合与相关的窗口列表进行分组,以便您可以对单窗口和多窗口应用程序配置访问控制。
您可以将功能定义为 src-tauri/capabilities 目录中的 JSON 或 TOML 文件。
下面的 JSON 定义了一个功能,该功能为核心插件和 window.setTitle API启用默认功能。
{ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "main-capability", "description": "Capability for the main window", "windows": ["main"], "permissions": [ "core:path:default", "core:event:default", "core:window:default", "core:app:default", "core:resources:default", "core:menu:default", "core:tray:default", "core:window:allow-set-title" ]}目标平台
通过定义 platforms 数组,功能可以是特定于平台的。 默认情况下,该功能适用于所有目标,但您可以选择 linux、macOS、windows、iOS 和 android 目标的一部分。
例如,让我们为桌面定义一个功能。注意,它启用了只能在桌面端使用的插件权限:
{ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "desktop-capability", "windows": ["main"], "platforms": ["linux", "macOS", "windows"], "permissions": ["global-shortcut:allow-register"]}并定义移动能力。注意,它启用了只能在移动设备上使用的插件的权限:
{ "$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 的功能:
{ "$schema": "../gen/schemas/linux-schema.json", "identifier": "linux-capability", "windows": ["main"], "platforms": ["iOS", "android"], "permissions": ["dbus::call"]}多窗口
windows 属性定义了应该引用权限列表的窗口列表。您可以使用通配模式来引用动态窗口标签。
下面的示例将该功能与 main 窗口和任何以 editor- 为前缀的标签窗口连接起来。
{ "windows": ["main", "editor-*"], "permissions": [ ... ]}作用域
作用域进一步限制命令。它们的格式是特定于插件的,但是 Tauri 提供了允许和拒绝某些命令操作的原语,通常限制命令输入。
例如,fs 插件允许你使用作用域来允许或拒绝某些目录和文件,http 插件使用作用域来过滤允许访问的 url。
让我们研究一些官方插件的例子:
- 允许任何
fs命令访问应用程序数据目录:
{ "permissions": [ { "identifier": "fs:scope", "allow": [{ "path": "$APPDATA" }, { "path": "$APPDATA/**" }] } ]}- 允许
fsrename命令访问主目录:
{ "permissions": [ { "identifier": "fs:allow-rename", "allow": [{ "path": "$HOME/**" }] } ]}- 配置
http插件的作用域:
{ "permissions": [ { "identifier": "http:default", "allow": [{ "url": "https://*.tauri.app" }], "deny": [{ "url": "https://private.tauri.app" }] } ]}远程访问
默认情况下,每个功能只适用于应用程序的嵌入式内容(无论是你的 devUrl 还是 frontendDist 前端)。
如果你想允许远程 URL 访问 Tauri 命令(这很危险,需要仔细配置),你可以使用 context 属性。
在下面的例子中,我们将该功能与任何 tauri.app 子域名关联。
{ "remote": { "urls": ["https://*.tauri.app"] }, "local": false, "permissions": [ ... ]}© 2024 Tauri Contributors. CC-BY / MIT