跳转到内容
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 仅对随 Tauri 应用程序一起发布的打包代码可访问。 为了允许远程源访问某些 Tauri 命令,可以在功能配置文件中定义这一点。

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

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
  • 供应链攻击或其他受损的开发人员系统

Tauri 通过 tauri-build 生成包含应用程序可用所有权限的 JSON 模式,允许在 IDE 中自动完成。 要使用模式,请将配置文件(.json 或 .toml)中的 $schema 属性设置为位于 gen/schemas 目录中的特定于平台的模式之一。通常你会将其设置为 ../gen/schemas/desktop-schema.json../gen/schemas/mobile-schema.json,尽管你也可以为特定目标平台定义功能。

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

Terminal window
tauri-app
├── index.html
├── package.json
├── src/
├── src-tauri/
├── Cargo.toml
├── capabilities/
└── <identifier>.json/toml
├── src/
├── tauri.conf.json

所有内容都可以内联到 tauri.conf.json 中,但即使是一点更高级的配置也会使该文件膨胀,并且这种方法的目标是尽可能抽象权限并简单易懂。

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


© 2025 Tauri Contributors. CC-BY / MIT