权限模型
灵动桌面框架基于 Tauri 2.x 的安全模型,默认最小权限原则。
安全架构
前端(WebView)→ IPC → 权限检查 → Rust Command → 系统资源
前端无法直接访问系统资源,所有操作都要经 IPC 交给 Rust 侧执行:
- 核心 / 插件命令(窗口、托盘、opener、store、updater 等)—— 按 Capabilities 声明 逐条检查,未声明的权限直接被拒
- 应用自己的 Command(
get_config、set_config等)—— 在lib.rs的invoke_handler(tauri::generate_handler![...])中注册后即可被前端调用;框架的build.rs只调用tauri_build::build(),没有为应用 Command 定义单独的权限清单,因此不受 capability 约束。只有注册进generate_handler!的函数才能被调用,参数校验在 Service 层完成(如ConfigService::set拒绝空键名)
安全规范
| 规范 | 说明 |
|---|---|
禁止前端 fetch 外部 API | 通过 Rust Command 代理网络请求 |
| 禁止硬编码文件路径 | 使用 Tauri Path API |
| 禁止 SQL 字符串拼接 | 使用参数化查询 |
禁止 unwrap() | 使用 Result + ? 运算符 |
CSP(内容安全策略)
框架模板默认未启用 CSP:
// src-tauri/tauri.conf.json
{
"app": {
"security": {
"csp": null
}
}
}
null 表示不注入任何 CSP,开发期最省事;发布前建议按应用实际加载的资源收紧,例如:
{
"app": {
"security": {
"csp": "default-src 'self'; img-src 'self' asset: https://asset.localhost; style-src 'self' 'unsafe-inline'"
}
}
}
WARNING
启用 CSP 后,前端加载的外部图片、字体、脚本以及 asset: 协议资源都要在对应指令里显式放行,否则会被拦截;改完需实测各页面是否有资源加载失败。