Skip to content

看门人:权限与能力

在现代应用开发中,安全性至关重要。由于 Tauri 应用的前端本质上是一个网页,它面临着与 Web 相同的威胁,例如 XSS (Cross-Site Scripting,跨站脚本攻击)。如果恶意脚本在你的前端运行,你肯定不希望它拥有对用户操作系统的无限制访问权限。

Tauri v2 引入了一个基于访问控制列表 (ACLs) 的强大新安全系统,我们称之为能力 (Capabilities)。这取代了 v1 中更简单的“允许列表”。

把 Tauri Core (Rust) 想象成一个高度安全的银行金库,而前端 (Frontend) 则是一位客户。客户不能随意走进金库并取走任何他们想要的东西。他们需要特定的钥匙来打开特定的保险箱。这些钥匙就是权限 (Permissions),而客户所持有的这组钥匙就是他们的能力 (Capability)。

能力 (Capabilities) 在 src-tauri/capabilities/ 目录下的 JSON 或 TOML 文件中定义。当你创建一个新应用时,你很可能会有一个 default.json 文件。

能力文件将一组权限映射到特定的窗口或 webview。以下是一个示例结构:

{
"identifier": "default-capability",
"description": "Capability for the main window",
"windows": ["main"],
"permissions": [
"core:default",
"fs:read-text-file",
"shell:open"
]
}
  • identifier:此能力集的唯一名称。
  • windows:授予这些权限的窗口标签列表(在 tauri.conf.json 中定义)。如果一个窗口未在此处列出,则它无法使用这些命令。
  • permissions:允许的特定 API 命令。core:default 通常涵盖基本的应用程序功能。

仅仅授予权限往往不够。例如,授予 fs:read-text-file 权限在技术上允许前端读取用户有权访问的任何文件。这是危险的。为了缓解这种情况,我们使用范围 (Scopes)。

范围 (Scope) 充当权限的过滤器。它定义了权限可以在何处或如何使用。你可以在能力文件内部直接定义范围。

{
"identifier": "fs-scope-example",
"windows": ["main"],
"permissions": [
{
"identifier": "fs:read-text-file",
"allow": [{ "path": "$HOME/Documents/*.txt" }],
"deny": [{ "path": "$HOME/Documents/secret.txt" }]
}
]
}

在上面的示例中,前端可以读取用户 Documents 文件夹中的任何 .txt 文件,除了 secret.txt。如果前端尝试读取 /etc/passwd 或 secret.txt,Rust 后端将立即拒绝该请求。

在 Tauri v2 中,大多数功能(文件系统、HTTP、对话框)已被移至插件。当你安装一个插件时,它会带有一组默认权限。你必须明确地将这些权限添加到你的能力文件中才能使用它们。

例如,在添加 HTTP 插件后,你必须将 http:default(用于广泛访问)或像 http:request 这样的细粒度权限添加到你的能力文件 permissions 数组中。如果你忘记这一步,前端的 API 调用将会静默失败或抛出“访问被拒绝”错误。