新闻详情

新闻详情

首页 / 资讯中心 / 详情

Tauri v2 `core:path` 权限体系全解析:路径命令白名单、默认权限集与底层实现

发布时间:2026/9/30 7:02:18来源:尧图网络
Tauri v2 `core:path` 权限体系全解析:路径命令白名单、默认权限集与底层实现
桌面应用跨平台移动开发【免费下载链接】tauriBuild smaller, faster, and more secure desktop and mobile applications with a web frontend.项目地址https://gitcode.com/GitHub_Trending/ta/tauri点击查看免费下载本篇技术指南围绕 Tauri v2 仓库中 path 插件的权限自动生成文档 reference.md 展开系统讲解core:path命名空间下的默认权限集、16 个 allow/deny 权限标识符、与之对应的 8 个路径命令的底层 Rust 实现以及如何在 capability 配置中精确控制 Web 前端的路径操作能力。读完本文你将掌握 path 插件的权限模型、每个权限的实际作用边界并能依据最小权限原则为你的应用配置安全的路径访问白名单。一、关联文档是什么权限自动生成的参考手册crates/tauri/permissions/path/autogenerated/reference.md是 Tauri v2 构建流程自动生成的权限参考文档。在 crates/tauri/build.rs 中构建脚本会枚举核心插件core与内置插件path、event、window、tray 等的命令列表为每个命令生成对应的allow-*/deny-*权限并输出到permissions/插件名/autogenerated/目录见 build.rs 中的define_permissions与autogenerate_command_permissions调用。因此这份 reference.md 是开发者查阅 path 插件可用权限标识符的权威来源也是编写 capability 配置时的查表依据。该文档由两个部分组成Default Permission默认权限集说明core:path:default聚合了哪些子权限Permission Table权限表列出全部 16 个权限标识符及其作用描述。二、默认权限集core:path:default开箱即用的 8 项能力根据 reference.md 的声明path 插件的默认权限集 enables all commands启用全部命令共包含 8 个权限默认权限对应命令allow-resolve-directoryresolve_directoryallow-resolveresolveallow-normalizenormalizeallow-joinjoinallow-dirnamedirnameallow-extnameextnameallow-basenamebasenameallow-is-absoluteis_absolute这意味着只要 capability 中引入了core:default核心默认权限集其中包含core:path:default应用就无需任何额外配置即可调用 path 模块的全部命令。官方前端库 packages/api/src/path.ts 的文档注释也印证了这一点所有 path 模块命令都属于core:path:default权限集默认启用因此无需额外的 capability 配置。在实际项目里你会在 capability 文件例如 examples/api/src-tauri/capabilities/run-app.json 中的core:default看到它的引用——core:default聚合了所有核心插件的默认权限集其中就包括core:path:default。三、Permission Table 逐项解读8 对 allow/deny 权限reference.md 的权限表列出了 16 个权限每个命令对应一对allow-*与deny-*权限权限标识符描述core:path:allow-basename在无预配置 scope 的情况下启用 basename 命令core:path:deny-basename在无预配置 scope 的情况下拒绝 basename 命令core:path:allow-dirname启用 dirname 命令core:path:deny-dirname拒绝 dirname 命令core:path:allow-extname启用 extname 命令core:path:deny-extname拒绝 extname 命令core:path:allow-is-absolute启用 is_absolute 命令core:path:deny-is-absolute拒绝 is_absolute 命令core:path:allow-join启用 join 命令core:path:deny-join拒绝 join 命令core:path:allow-normalize启用 normalize 命令core:path:deny-normalize拒绝 normalize 命令core:path:allow-resolve启用 resolve 命令core:path:deny-resolve拒绝 resolve 命令core:path:allow-resolve-directory启用 resolve_directory 命令core:path:deny-resolve-directory拒绝 resolve_directory 命令几点需要说明的语义细节命名空间前缀core:path 是 Tauri 的核心内置插件因此权限标识符带core:前缀形如core:path:allow-join。这与第三方插件如sample:allow-ping的命名规则一致前者在 run-app.json 中可见。without any pre-configured scope无预配置 scope这 8 个路径命令本身不接受 scope 参数它们处理的是纯字符串路径或 BaseDirectory 枚举而非受限文件系统路径因此权限描述统一为无预配置 scope。allow 与 deny 的优先级在 capability 中deny 规则优先于 allow 规则。若你需要默认放开、个别收紧的粒度控制可参考 run-app.json 中deny数组的用法该文件展示了如何对sample:allow-ping施加 deny 子规则。每个权限对应唯一命令从 reference.md 与 plugin.rs 的注册代码看8 个权限与 8 个命令一一对应无冗余、无交叉。四、底层实现8 个命令在 Rust 侧如何工作path 插件的全部命令定义在 crates/tauri/src/path/plugin.rs并通过generate_handler![#![plugin(path)] ...]注册到插件 Builder见 plugin.rs。逐一对照参考文档理解它们的真实行为1.resolve_directory权限allow-resolve-directory接收BaseDirectory枚举与可选相对路径解析出对应系统目录的绝对路径并用dunce::simplified去除 Windows 路径前缀噪声pub fn resolve_directoryR: Runtime( _app: AppHandleR, resolver: State_, PathResolverR, directory: BaseDirectory, path: OptionPathBuf, ) - ResultPathBuf { super::resolve_path(resolver, directory, path).map(|p| dunce::simplified(p).to_path_buf()) }它在 JS 侧对应appDataDir()、configDir()、homeDir()等目录查询函数见 packages/api/src/path.ts 中一系列*Dir()API。2.resolve权限allow-resolve以std::env::current_dir()为起点将传入的路径片段逐一PathBuf::push合并遇绝对路径片段会整体替换当前路径再做normalize_path规范化pub fn resolve(paths: VecString) - ResultPathBuf { let mut path std::env::current_dir().map_err(Error::CurrentDir)?; for p in paths { path.push(p); } Ok(dunce::simplified(normalize_path(path)).to_path_buf()) }该行为对齐 Node.js 的path.resolve语义源码注释中给出了两个示例vec![.]/vec![]等价于当前工作目录vec![/foo/bar, /tmp/file, baz]等价于/tmp/file/baz。JS 侧对应 path.ts 的resolve(...paths)。3.normalize权限allow-normalize去除./..段并简化路径normalize_path_no_absolute不解析为绝对路径行为刻意对齐 Node.jsnormalize()与normalize(.)返回.normalize(..)返回..传入路径带尾部分隔符时结果也会保留尾部分隔符。这在 plugin.rs 的实现和单元测试normalizeplugin.rs中都有明确验证。4.join权限allow-join用平台分隔符拼接多个路径段元素之间插入MAIN_SEPARATOR以保证path.components()能正确切分随后归一化空输入返回.。对应 plugin.rs其单元测试joinplugin.rs覆盖了空串、重复分隔符、混合绝对路径等场景如join([a, /b, c])在 Unix 下得到a/b/cWindows 下得到a\b\c。5.dirname权限allow-dirname返回路径的父目录无父目录如仅一个文件名时返回Error::NoParent。JS 侧dirname(/path/to/somedir/)返回/path/to。6.extname权限allow-extname提取路径的文件扩展名去掉点号无扩展名返回Error::NoExtension。7.basename权限allow-basename返回路径最后一段可传入可选ext参数剥离去掉指定的扩展名后缀若尾部不匹配则原样返回。单元测试plugin.rs验证了多种边界basename(/path/to/some-json-file.json, Some(.json))返回some-json-fileext传json无点时返回some-json-file.对.json.json这类双扩展名只剥一层。8.is_absolute权限allow-is-absolute判断路径是否为绝对路径返回布尔值。实现非常简洁pub fn is_absolute(path: String) - bool { Path::new(path).is_absolute() }平台差异与路径分隔符注入插件初始化时plugin.rs会按平台注入分隔符与路径列表分隔符Windows 为(\\, ;)其余平台为(/, :)并通过 init.js 模板写入window.__TAURI_INTERNALS__.plugins.path.sep / delimiter。JS 侧sep、delimiter常量即来源于此。五、与BaseDirectory的关系resolve-directory 的能力范围resolve_directory的输入BaseDirectory定义在 crates/tauri/src/path/mod.rs共 23 个取值每个对应系统目录并在resolve_pathmod.rs中映射到PathResolver的具体方法取值变量形式说明Audio/Cache/Config/Data/LocalData/Document/Download/Picture/Public/Video$AUDIO…$VIDEO标准系统目录Resource$RESOURCE应用资源目录拼接路径时会把..转为_up_、/转为_root_与打包器的资源注入算法一致Temp$TEMP系统临时目录AppConfig/AppData/AppLocalData/AppCache/AppLog$APPCONFIG…$APPLOG应用专属目录可被app appDirectoriesOverride配置覆盖Home$HOME用户主目录Desktop/Executable/Font/Runtime/Template$DESKTOP…$TEMPLATE仅桌面端可用带#[cfg(not(target_os android))]条件编译这与 packages/api/src/path.ts 中的BaseDirectory枚举完全对齐。需要留意的是平台差异Android 上desktopDir、executableDir、fontDir、runtimeDir、templateDir不存在且所有用户目录都被沙箱化到应用自身存储中iOS 上所有目录都解析在应用沙箱内、随安装变化因此不应持久化绝对路径。六、实战capability 中如何配置 path 权限Tauri v2 采用 capability 文件声明式授权。权限配置的三种典型写法写法一全量默认推荐起步{ identifier: default, windows: [main], permissions: [core:default] }core:default内部聚合了core:path:default8 个路径命令全部可用。写法二最小权限白名单若只想开放basename与join则显式引入两个 allow 权限{ identifier: path-minimal, windows: [main], permissions: [ core:path:allow-basename, core:path:allow-join ] }这样resolve、normalize、dirname、extname、is_absolute、resolve_directory均不可调用任何调用都会因权限不足被 IPC 层拒绝。写法三显式 deny 覆盖{ identifier: path-with-deny, windows: [main], permissions: [ core:path:default, { identifier: core:path:deny-resolve-directory } ] }deny 优先级高于 allow即使默认集放开了全部命令resolve_directory仍会被拒绝。完整的真实示例可参考 examples/api/src-tauri/capabilities/run-app.json其中同时使用了字符串形式的权限标识符与带allow/deny子规则的对象形式。七、JS 侧调用与权限的对应关系前端通过tauri-apps/api/path调用命令经 IPC 转发到 Rust 侧同名命令。映射关系如下实现见 packages/api/src/path.tsJS API实际 invoke 命令所需权限resolve(...paths)plugin:path\|resolvecore:path:allow-resolvenormalize(path)plugin:path\|normalizecore:path:allow-normalizejoin(...paths)plugin:path\|joincore:path:allow-joindirname(path)plugin:path\|dirnamecore:path:allow-dirnameextname(path)plugin:path\|extnamecore:path:allow-extnamebasename(path, ext?)plugin:path\|basenamecore:path:allow-basenameisAbsolute(path)plugin:path\|is_absolutecore:path:allow-is-absoluteappDataDir()等*Dir()系列plugin:path\|resolve_directorycore:path:allow-resolve-directory例如前端代码import { basename, join, isAbsolute } from tauri-apps/api/path const name await basename(/path/to/app.conf) // app.conf const p await join(/home/tauri, docs, guide.md) // /home/tauri/docs/guide.md const abs await isAbsolute(/tmp) // true八、安全实践与边界遵循最小权限原则path 命令虽无文件系统 scope 限制但每开放一个命令就多一个攻击面。只声明你真正用到的core:path:allow-*权限或用deny-*覆盖默认集。注意路径遍历防护Rust 侧存在SafePathBufmod.rs用于阻止包含..的路径穿越resolve/join等命令内部也会对..做归一化处理但业务层仍需警惕将用户输入直接拼入路径。移动端差异Android/iOS 的目录解析均在沙箱内详见 path.ts 的 Platform-specific 说明不要持久化移动端绝对路径应运行时动态解析。版本与生成物一致性reference.md 由 build.rs 自动生成属于构建产物而非手写文档升级 Tauri 版本后建议重新生成并复核权限表是否有新增命令。九、小结core:path:default通过聚合 8 个allow-*权限实现了路径命令的全量默认启用而 16 个allow-*/deny-*权限标识符提供了细粒度的按命令控制能力。理解 reference.md 中的权限表、结合 plugin.rs 的命令实现与 packages/api/src/path.ts 的 JS 封装你就可以精确设计应用的路径能力边界在安全与便利之间取得平衡。赞分享桌面应用跨平台移动开发【免费下载链接】tauriBuild smaller, faster, and more secure desktop and mobile applications with a web frontend.项目地址https://gitcode.com/GitHub_Trending/ta/tauri点击查看免费下载相关推荐三步把 QQ 空间历史说说备份到本地GetQzonehistory 新手教程三步把 QQ 空间历史说说备份到本地GetQzonehistory 新手教程 想找 5 年前发的一条说说翻消息列表却翻不到底散在云端的记忆说丢就丢。Get网页爬虫数据分析anarlog fs-sync 插件的 Tauri 权限体系默认权限集与 34 组命令访问控制全解anarlog fs sync 插件的 Tauri 权限体系默认权限集与 34 组命令访问控制全解 本篇基于仓库中的自动生成权限参考文档 reference.AI 应用人工智能语音本地部署桌面应用音频Tauri 2 core:app 权限体系完全指南默认权限集、权限表与能力配置实战Tauri 2 core:app 权限体系完全指南默认权限集、权限表与能力配置实战 本篇技术指南围绕 Tauri 2 核心插件 app 的权限体系展开以仓库桌面应用跨平台移动开发上一篇VidBee 视频格式转换:MP4、AVI、MKV 互转 5 分钟搞定下一篇TypeSpec社区贡献指南如何为这个微软开源项目提交PR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

域文件服务器共享盘设置:从权限配置到GPO自动映射实战 2026/9/30 7:54:57

域文件服务器共享盘设置:从权限配置到GPO自动映射实战

简介:这份资源面向企业IT运维人员与Windows Server学习者,聚焦在Windows Server 2016环境下搭建域文件服务器共享盘的完整配置思路。内容围绕AD基础结构展开,涵盖组织单位与用户组的创建、文件服务器加入域、共享文件夹与NTFS权限分配&#x…

阅读更多 →
什么是AI技能(Skill)?从原理到实战,手把手教你构建自己的技能包 2026/9/30 7:54:43

什么是AI技能(Skill)?从原理到实战,手把手教你构建自己的技能包

最近不管是在技术社群还是朋友圈,总能看到有人在聊 Skill。一会儿是"Claude 的技能又更新了",一会儿是"这个 Skill 也太好用了吧",甚至还有不少人在分享自己写的 Skill。说实话,我第一次看到这个词的时候也是…

阅读更多 →
Obsidian+Git:打造笔记自动备份与多设备同步的版本管理体系 2026/9/30 7:54:43

Obsidian+Git:打造笔记自动备份与多设备同步的版本管理体系

有一次我熬夜整理完一周的阅读笔记,第二天系统更新后进入桌面发现老文件全部不见了,整个人懵了。好在当时笔记库已经交给Git托管,一条git checkout命令就把半个库救了回来。从那之后,用Obsidian记录、用Git做版本管理,…

阅读更多 →
json-server实战:零代码实现前端接口模拟与联调加速 2026/9/30 7:54:43

json-server实战:零代码实现前端接口模拟与联调加速

第一次听说 json-server 的时候,我正被后端接口进度卡得焦头烂额。需求评审完,前端排期排得密不透风,结果后端同学拍着胸脯说“接口下周给你”,结果下周复下周,眼看联调时间被压缩得只剩两三天,前端组只好在…

阅读更多 →
知网AIGC检测算法升级后,如何有效降低AI生成痕迹? 2026/9/30 7:54:43

知网AIGC检测算法升级后,如何有效降低AI生成痕迹?

“知网AIGC检测算法升级后怎么降AI”这个问题,最近后台咨询量暴增,各个年级的学生都在问。我自己手上的几篇论文,以及帮朋友看的稿件,前段时间也确实陆续撞上了新算法的“枪口”。先说结论:如果还用2023年那种“同义词…

阅读更多 →
WebRTC分布式协作实战:信令、SFU与弱网优化策略 2026/9/30 7:54:43

WebRTC分布式协作实战:信令、SFU与弱网优化策略

分布式协作这几年几乎是所有团队绕不开的命题,尤其当成员分散在不同城市甚至不同时区时,"实时音视频通信"就成了比文字消息更刚性的一层基础设施。我自己在做的多端协作工具里,就有一段从自研信令到全面切回WebRTC协议栈的经历&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉