跳到内容
Tauri

功能

Tauri 为应用程序和插件开发者提供了一个功能系统,以精细地启用和约束核心功能对系统 WebView 中运行的应用程序前端的暴露。

功能定义了哪些权限被授予或拒绝给哪些窗口或 webview。

功能可以影响多个窗口和 webview,并且可以在多个功能中引用它们。

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

最佳实践是使用单独的文件,并且仅在 tauri.conf.json 中通过标识符引用它们,但也可以直接在 capabilities 字段中定义它们。

默认情况下,capabilities 目录内的所有功能都会自动启用。一旦在 tauri.conf.json 中显式启用功能,则只有这些功能会用于应用程序构建。

有关配置方案的完整参考,请参阅参考部分。

以下 JSON 示例定义了一个功能,该功能允许主窗口使用核心插件的默认功能和 window.setTitle API。

src-tauri/capabilities/default.json
{
"$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"
]
}

这些代码片段是Tauri 配置文件的一部分。

这可能是最常见的配置方法,其中各个功能是内联的,并且仅通过标识符引用权限。

这需要在 capabilities 目录中定义完善的功能文件。

src-tauri/tauri.conf.json
{
"app": {
"security": {
"capabilities": ["my-capability", "main-capability"]
}
}
}

内联功能可以与预定义的功能混合使用。

src-tauri/tauri.conf.json
{
"app": {
"security": {
"capabilities": [
{
"identifier": "my-capability",
"description": "My application capability used for all windows",
"windows": ["*"],
"permissions": ["fs:default", "allow-home-read-extended"]
},
"my-second-capability"
]
}
}
}

默认情况下,您在应用程序中注册的所有命令(使用 tauri::Builder::.invoke_handler 函数)都允许应用程序的所有窗口和 webview 使用。要更改此设置,请考虑使用 AppManifest::commands

src-tauri/build.rs
fn main() {
tauri_build::try_build(
tauri_build::Attributes::new()
.app_manifest(tauri_build::AppManifest::new().commands(&["your_command"])),
)
.unwrap();
}

目标平台

功能可以是平台特定的,通过定义 platforms 数组。默认情况下,该功能应用于所有目标,但您可以选择 linuxmacOSwindowsiOSandroid 目标的子集。

例如,桌面操作系统的功能。请注意,它启用了仅在桌面上可用的插件的权限

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"
]
}

远程 API 访问

默认情况下,API 仅对与 Tauri App 一起捆绑的代码可访问。要允许远程源访问某些 Tauri 命令,可以在功能配置文件中定义此项。

此示例将允许从 tauri.app 的所有子域扫描 NFC 标签并使用条形码扫描器。

src-tauri/capabilities/remote-tags.json
{
"$schema": "../gen/schemas/remote-schema.json",
"identifier": "remote-tag-capability",
"windows": ["main"],
"remote": {
"urls": ["https://*.tauri.app"]
},
"platforms": ["iOS", "android"],
"permissions": ["nfc:allow-scan", "barcode-scanner:allow-scan"]
}

安全边界

它可以防止什么?

根据权限和功能,它可以

  • 最大限度地减少前端泄露的影响
  • 防止或减少本地系统接口和数据(意外)暴露
  • 防止或减少从前端到后端/系统的可能的权限提升

不能防止什么?

  • 恶意或不安全的 Rust 代码
  • 过于宽松的作用域和配置
  • 命令实现中不正确的作用域检查
  • 来自 Rust 代码的有意绕过
  • 基本上任何在应用程序的 rust 核心中编写的内容
  • 系统 WebView 中的 0-day 或未修补的 1-day 漏洞
  • 供应链攻击或以其他方式受损的开发者系统

Schema 文件

Tauri 生成 JSON schema,其中包含应用程序可用的所有权限,从而允许在您的 IDE 中自动完成。要使用 schema,请在您的配置中将 $schema 属性设置为位于 gen/schemas 目录中的平台特定 schema 之一。通常,您会将其设置为 ../gen/schemas/desktop-schema.json../gen/schemas/mobile-schema.json,但您也可以为特定目标平台定义功能。

配置文件

示例 Tauri 应用程序目录结构的简化示例

终端窗口
tauri-app
├── index.html
├── package.json
├── src
├── src-tauri
├── Cargo.toml
├── capabilities
└── <identifier>.json/toml
├── src
├── tauri.conf.json

一切都可以内联到 tauri.conf.json 中,但即使是稍微更高级的配置也会使此文件膨胀,并且此方法的目的是尽可能抽象出权限,并使其易于理解。

核心权限

所有核心权限的列表可以在核心权限页面上找到。


© 2025 Tauri 贡献者。CC-BY / MIT