Tauri 权限系统从零掌握 Permissions 与 Capabilities

📅 发布时间:2026/7/15 18:34:03 👁️ 浏览次数:
Tauri 权限系统从零掌握 Permissions 与 Capabilities
一、什么是 Tauri 权限Permissions在 Tauri 中权限Permission是对命令Command访问特权的显式描述。它定义了哪些命令可以被调用allow / deny命令可以操作的作用域Scope例如文件路径白名单/黑名单多个权限的组合形成更高层次的权限集权限的核心作用是将前端 WebView 对系统资源的访问限制在一个明确、可审计的范围内避免恶意代码或意外操作对用户系统造成危害。一个基础的权限配置示例如下[[permission]] identifier my-identifier description This describes the impact and more. commands.allow [ read_file ] [[scope.allow]] my-scope $HOME/* [[scope.deny]] my-scope $HOME/secret在这个例子中允许调用read_file命令允许访问$HOME下的所有文件但明确拒绝访问$HOME/secret目录权限配置完成后需要在Capability能力文件中引用它才能真正作用于应用窗口或 WebView。二、权限能做什么Tauri 权限的能力可以概括为以下几点启用或禁用前端可调用的命令控制哪些 Tauri 命令Rust 侧暴露的函数可以被前端 JavaScript 调用。绑定作用域Scope到命令限制命令操作的范围例如只允许读取特定目录下的文件。组合多个权限为权限集Permission Set将多个细粒度权限打包便于复用和管理。三、权限标识符规则权限的identifier字段遵循严格的命名规范命名格式格式含义name:default插件或应用的默认权限name:command-name针对某个具体命令的权限注意这里的name是插件 crate 名称去掉tauri-plugin-前缀后的部分用于命名空间隔离降低命名冲突的可能性。对于应用自身的命令不需要加前缀。Tauri 编译时会自动为插件标识符添加tauri-plugin-前缀开发者无需手动指定。字符与长度限制标识符只允许使用ASCII 小写字母[a-z]且长度有严格上限最大 116 字符原因如下constIDENTIFIER_SEPARATOR:u8b:;constPLUGIN_PREFIX:strtauri-plugin-;constMAX_LEN_PREFIX:usize64-PLUGIN_PREFIX.len();// 51constMAX_LEN_BASE:usize64;constMAX_LEN_IDENTIFIER:usizeMAX_LEN_PREFIX1MAX_LEN_BASE;// 116四、配置文件结构插件的目录结构作为插件开发者权限文件放置在插件项目的permissions/目录下tauri-plugin/ ├── README.md ├── src/ │ └── lib.rs ├── build.rs ├── Cargo.toml └── permissions/ ├── identifier.json # 或 .toml └── default.json # 默认权限特殊处理特别说明default权限文件会被 Tauri CLI 在添加插件时自动加入应用配置无需手动引用。应用的目录结构作为应用开发者除了permissions/目录还需要维护capabilities/目录tauri-app/ ├── index.html ├── package.json ├── src/ └── src-tauri/ ├── Cargo.toml ├── permissions/ # 权限定义仅 TOML 格式 │ └── identifier.toml ├── capabilities/ # 能力配置JSON/JSON5/TOML 均可 │ └── identifier.json ├── src/ └── tauri.conf.json格式区别capabilities文件支持json、json5、toml三种格式而permissions文件只支持toml格式。五、实战示例文件系统插件权限以 Tauri 官方文件系统fs插件为例展示完整的权限配置方式。1. 作用域权限允许访问 HOME 目录# plugins/fs/permissions/autogenerated/base-directories/home.toml [[permission]] identifier scope-home description This scope permits access to all files and list content of top level directories in the $HOME folder. [[scope.allow]] path $HOME/*这个权限只定义了作用域不开放任何命令专门用于后续与命令权限组合使用。2. 命令权限开放所有文件读取命令# plugins/fs/permissions/read-files.toml [[permission]] identifier read-files description This enables all file read related commands without any pre-configured accessible paths. commands.allow [ read_file, read, open, read_text_file, read_text_file_lines, read_text_file_lines_next ]这个权限开放了一组读取相关命令但没有限制路径范围需要配合作用域权限使用。3. 单命令权限允许创建目录# plugins/fs/permissions/autogenerated/commands/mkdir.toml [[permission]] identifier allow-mkdir description This enables the mkdir command. commands.allow [ mkdir ]六、权限集Permission Set组合与复用权限集Permission Set是 Tauri 权限系统的强大特性允许将多个权限合并为一个新的标识符方便在 Capability 文件中统一引用。应用层扩展插件权限# my-app/src-tauri/permissions/home-read-extends.toml [[set]] identifier allow-home-read-extended description This allows non-recursive read access to files and to create directories in the $HOME folder. permissions [ fs:read-files, # 引用 fs 插件的读取命令权限 fs:scope-home, # 引用 fs 插件的 HOME 作用域权限 fs:allow-mkdir # 引用 fs 插件的 mkdir 权限 ]通过权限集我们将三个独立权限合并为allow-home-read-extended只需在 Capability 中引用这一个标识符即可完整授予在 HOME 目录下读取文件并创建目录的能力。权限集的典型应用场景跨平台权限分组将 Windows、macOS、Linux 各自的特定权限归组为操作系统级权限集功能模块打包将某个业务功能所需的所有权限打包为一个语义化的权限集简化主配置文件避免在 Capability 文件中罗列大量细粒度权限七、权限引用规则总结在引用插件权限时格式为plugin-name:permission-identifier例如fs:read-files → 文件系统插件的 read-files 权限 fs:scope-home → 文件系统插件的 scope-home 权限 fs:allow-mkdir → 文件系统插件的 allow-mkdir 权限对于应用自身定义的权限直接使用identifier即可无需前缀。八、最佳实践建议最小权限原则只开放应用实际需要的命令避免给予过于宽泛的权限。作用域配合命令不要只配置命令权限而不限制作用域尤其是文件系统相关操作。善用权限集将相关权限打包为语义明确的权限集提升配置可读性和可维护性。利用default权限插件开发者应提供合理的default权限让应用开发者开箱即用。显式拒绝敏感路径在scope.deny中明确排除敏感目录如$HOME/secret、.ssh等。总结Tauri 的权限系统通过Permission权限、Scope作用域、Permission Set权限集和Capability能力四个层次构建了一套完整、灵活且安全的访问控制体系。权限定义能做什么作用域定义能操作哪些资源权限集负责复用和组合Capability 将权限授予具体的窗口/WebView理解并善用这套机制是构建安全 Tauri 应用的基础。随着 Tauri 生态的不断完善权限系统也会持续演进建议关注官方文档获取最新信息。