SuperAPI AI 工具集

configuring-tauri-capabilities

安全与审计

查看项目

更新于 10-15 17:50

技能介绍

用途

Capabilities 是 Tauri 的权限管理系统,用于精细控制前端可以访问哪些 API 和命令。它通过指定哪些权限应用于哪些窗口或 WebView 来定义安全边界,帮助开发者将前端被攻破时的影响降到最低。

主要能力

Capabilities 作为权限与窗口/WebView 之间的桥梁,可以:

  • 定义针对特定窗口授予或拒绝哪些权限
  • 基于窗口标签(而非标题)创建安全边界
  • 支持平台特定目标(桌面端与移动端)

能力文件位置与结构

能力文件位于 src-tauri/capabilities/,使用 JSON 或 TOML 格式。文件包含以下字段:

字段 是否必需 说明
identifier 是 唯一能力名称
description 否 用途说明
windows 是 目标窗口标签(支持通配符)
permissions 是 允许/拒绝的操作数组
platforms 否 目标平台(linux、macOS、windows、iOS、android)
remote 否 远程 URL 访问配置
$schema 否 生成的 schema 引用,用于 IDE 支持

基础示例(src-tauri/capabilities/main.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"
  ]
}

默认情况下,src-tauri/capabilities/ 中的所有能力都会自动启用,无需额外配置。若要显式控制启用哪些能力,可在 tauri.conf.json 中配置:

{
  "app": {
    "security": {
      "capabilities": ["main-capability", "editor-capability"]
    }
  }
}

显式配置后,只有列出的能力会生效。

使用方式

配置方法

方法一:独立文件(推荐)

将各个能力文件存放在 capabilities 目录中,并在 tauri.conf.json 中按 identifier 引用:

{
  "app": {
    "security": {
      "capabilities": ["main-capability", "editor-capability", "settings-capability"]
    }
  }
}

方法二:内联定义

直接在 tauri.conf.json 中嵌入能力:

{
  "app": {
    "security": {
      "capabilities": [
        {
          "identifier": "my-capability",
          "description": "Capability used for all windows",
          "windows": ["*"],
          "permissions": ["fs:default", "core:window:default"]
        }
      ]
    }
  }
}

方法三:混合方式

结合基于文件与内联的能力:

{
  "app": {
    "security": {
      "capabilities": [
        {
          "identifier": "inline-capability",
          "windows": ["*"],
          "permissions": ["fs:default"]
        },
        "file-based-capability"
      ]
    }
  }
}

按窗口分配能力

使用窗口标签为不同窗口分配不同权限:

  • 单窗口:"windows": ["main"]
  • 多个指定窗口:"windows": ["editor", "preview"]
  • 通配符(所有窗口):"windows": ["*"]
  • 模式匹配:"windows": ["dialog-*"]

权限语法

权限遵循命名约定:

模式 说明
<plugin>:default 插件的默认权限集
<plugin>:allow-<command> 允许特定命令
<plugin>:deny-<command> 拒绝特定命令

核心权限示例:

{
  "permissions": [
    "core:path:default",
    "core:event:default",
    "core:window:default",
    "core:window:allow-set-title",
    "core:window:allow-close",
    "core:app:default",
    "core:resources:default",
    "core:menu:default",
    "core:tray:default"
  ]
}

插件权限示例:

{
  "permissions": [
    "fs:default",
    "fs:allow-read-file",
    "fs:allow-write-file",
    "shell:allow-open",
    "dialog:allow-open",
    "dialog:allow-save",
    "http:default",
    "clipboard-manager:allow-read",
    "clipboard-manager:allow-write"
  ]
}

平台特定能力

使用 platforms 数组指定目标平台。

仅桌面端:

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

仅移动端:

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

也可为平台变体创建独立文件,例如 src-tauri/capabilities/desktop.json 与 src-tauri/capabilities/mobile.json。

远程 API 访问

允许远程 URL 访问 Tauri 命令(需谨慎使用):

{
  "$schema": "../gen/schemas/remote-schema.json",
  "identifier": "remote-capability",
  "windows": ["main"],
  "remote": {
    "urls": ["https://*.example.com"]
  },
  "permissions": ["http:default"]
}

自定义能力示例

多窗口应用可按窗口设置不同权限级别,例如主窗口拥有完整访问权限,设置窗口权限受限,预览窗口为只读访问。

适用场景

  • 需要为多窗口应用设置差异化权限边界
  • 需要针对桌面端与移动端分别配置权限
  • 需要限制前端可访问的系统接口,降低前端被攻破的影响
  • 需要为远程 URL 配置受控的 API 访问

限制

Capabilities 可以防护:前端被攻破的影响、非预期的系统接口暴露、前端到后端的权限提升。

Capabilities 不能防护:恶意的 Rust 代码、过于宽松的 scope、WebView 漏洞。

最佳实践

  • 最小权限原则:只授予每个窗口所需的权限
  • 按窗口分离能力:为不同窗口创建独立的能力文件
  • 使用描述性标识符:清晰命名能力(如 main-window、editor-readonly)
  • 记录能力:包含说明用途的 description
  • 审查远程访问:仔细审计任何远程 URL 访问配置
  • 测试权限边界:验证窗口无法访问未授权的 API

Schema 支持

生成的 schema 提供 IDE 自动补全,可在能力文件中引用:

{
  "$schema": "../gen/schemas/desktop-schema.json"
}

构建后可用 schema:desktop-schema.json(桌面平台)、mobile-schema.json(移动平台)、remote-schema.json(远程访问能力)。

故障排查

  • 权限被拒绝错误:检查能力是否包含所需权限并指向正确的窗口标签
  • 能力未生效:确认能力文件位于 src-tauri/capabilities/ 或在 tauri.conf.json 中显式列出
  • 窗口标签不匹配:能力中的窗口标签必须与 Rust 代码中创建窗口时定义的标签一致,标签区分大小写