能力
Tauri 为应用程序和插件开发者提供了一个能力系统,用于精细地启用和限制系统 WebView 中运行的应用程序前端的核心暴露。
能力定义了哪些权限被授予或拒绝给哪些窗口或 Web 视图。
能力可以影响多个窗口和 Web 视图,并且这些窗口和 Web 视图可以在多个能力中被引用。
能力文件在 src-tauri/capabilities
目录中定义为 JSON 或 TOML 文件。
最佳实践是使用单独的文件,并在 tauri.conf.json
中仅通过标识符引用它们,但也可以直接在 capabilities
字段中定义它们。
capabilities
目录中的所有能力默认情况下都会自动启用。一旦在 tauri.conf.json
中明确启用了能力,只有这些能力会在应用程序构建中使用。
有关配置方案的完整参考,请参阅参考部分。
以下 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" ]}
这些代码片段是 Tauri 配置文件的一部分。
这可能是最常见的配置方法,其中各个能力是内联的,并且只通过标识符引用权限。
这需要在 capabilities
目录中定义明确的能力文件。
{ "app": { "security": { "capabilities": ["my-capability", "main-capability"] } }}
内联能力可以与预定义能力混合使用。
{ "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
函数)都允许被应用的所有窗口和 Web 视图使用。要更改此设置,请考虑使用 AppManifest::commands
。
fn main() { tauri_build::try_build( tauri_build::Attributes::new() .app_manifest(tauri_build::AppManifest::new().commands(&["your_command"])), ) .unwrap();}
能力可以通过定义 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" ]}
默认情况下,API 仅可由与 Tauri 应用程序捆绑的代码访问。为了允许远程源访问某些 Tauri 命令,可以在能力配置文件中定义此项。
此示例将允许从 tauri.app
的所有子域扫描 NFC 标签并使用条形码扫描仪。
{ "$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 中的零日或未打补丁的单日漏洞
- 供应链攻击或其他受损的开发者系统
Tauri 通过 tauri-build
生成 JSON schema,其中包含应用程序可用的所有权限,从而允许在 IDE 中进行自动补全。要使用 schema,请在配置文件(.json 或 .toml)中将 $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