权限控制 #
一、权限系统概述 #
1.1 权限模型 #
Tauri 2.x 引入了细粒度的权限控制系统:
text
┌─────────────────────────────────────────────────────────────┐
│ 权限模型 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Capability │ │ Permission │ │ Scope │ │
│ │ 能力配置 │───►│ 权限 │───►│ 范围 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ Capability: 定义窗口可以做什么 │
│ Permission: 定义具体权限 │
│ Scope: 定义权限的作用范围 │
│ │
└─────────────────────────────────────────────────────────────┘
1.2 权限类型 #
| 类型 | 说明 | 示例 |
|---|---|---|
| 允许权限 | 允许执行某操作 | fs:allow-read |
| 拒绝权限 | 拒绝执行某操作 | fs:deny-write |
| 默认权限 | 插件默认权限集 | fs:default |
二、权限配置 #
2.1 基本配置 #
json
// src-tauri/capabilities/default.json
{
"$schema": "https://schema.tauri.app/config/2/capability",
"identifier": "default",
"description": "Default capability for the main window",
"windows": ["main"],
"permissions": [
"core:default",
"shell:allow-open",
"dialog:allow-open"
]
}
2.2 多窗口权限 #
json
// src-tauri/capabilities/default.json
{
"identifier": "default",
"windows": ["main", "settings"],
"permissions": [
"core:default",
"fs:default"
]
}
json
// src-tauri/capabilities/guest.json
{
"identifier": "guest",
"windows": ["guest"],
"permissions": [
"core:default"
]
}
2.3 权限范围 #
json
{
"identifier": "fs-restricted",
"windows": ["main"],
"permissions": [
{
"identifier": "fs:allow-read-text-file",
"allow": [
{ "path": "$APPDATA/**" },
{ "path": "$DOCUMENT/**" }
]
},
{
"identifier": "fs:allow-write-text-file",
"allow": [
{ "path": "$APPDATA/myapp/**" }
]
}
]
}
三、核心权限 #
3.1 核心权限列表 #
text
core:default 默认核心权限集
core:app:default 应用默认权限
core:app:allow-app-hide
core:app:allow-app-show
core:window:default 窗口默认权限
core:window:allow-close
core:window:allow-minimize
core:window:allow-maximize
core:event:default 事件默认权限
core:event:allow-emit
core:event:allow-listen
3.2 文件系统权限 #
text
fs:default 默认文件系统权限
fs:allow-read-text-file
fs:allow-write-text-file
fs:allow-read-dir
fs:allow-exists
fs:allow-mkdir
fs:allow-remove
fs:allow-rename
fs:allow-copy-file
3.3 Shell 权限 #
text
shell:default 默认 Shell 权限
shell:allow-open 允许打开外部程序
shell:allow-execute 允许执行命令
3.4 对话框权限 #
text
dialog:default 默认对话框权限
dialog:allow-open 允许打开文件选择
dialog:allow-save 允许保存对话框
dialog:allow-message 允许消息对话框
dialog:allow-ask 允许询问对话框
四、自定义权限 #
4.1 定义权限 #
rust
// src-tauri/src/permissions.rs
use tauri::permission::{Permission, PermissionSet};
pub fn define_permissions() -> PermissionSet {
PermissionSet::new("my-app")
.add_permission(Permission::new(
"allow-sensitive-operation",
"Allow sensitive operation",
))
.add_permission(Permission::new(
"deny-sensitive-operation",
"Deny sensitive operation",
))
}
4.2 注册权限 #
rust
// src-tauri/src/lib.rs
mod permissions;
fn main() {
tauri::Builder::default()
.permission(permissions::define_permissions())
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
4.3 使用自定义权限 #
json
{
"permissions": [
"my-app:allow-sensitive-operation"
]
}
五、权限检查 #
5.1 命令权限检查 #
rust
use tauri::command;
#[command]
async fn sensitive_operation(app: tauri::AppHandle) -> Result<(), String> {
// 检查权限
if !app.has_permission("my-app:allow-sensitive-operation") {
return Err("Permission denied".to_string());
}
// 执行操作
Ok(())
}
5.2 动态权限检查 #
rust
use tauri::Manager;
#[command]
async fn check_and_execute(
app: tauri::AppHandle,
window: tauri::Window,
) -> Result<String, String> {
// 获取窗口能力
let capability = window.capability();
// 检查权限
if capability.has_permission("fs:allow-read-text-file") {
// 有权限,执行操作
Ok("Has permission".to_string())
} else {
Err("Permission denied".to_string())
}
}
六、权限范围 #
6.1 文件路径范围 #
json
{
"identifier": "fs:allow-read-text-file",
"allow": [
{ "path": "$HOME/**" },
{ "path": "$DOCUMENT/**" },
{ "path": "$DOWNLOAD/**" }
]
}
6.2 URL 范围 #
json
{
"identifier": "http:default",
"allow": [
{ "url": "https://api.example.com/**" },
{ "url": "https://cdn.example.com/**" }
]
}
6.3 Shell 命令范围 #
json
{
"identifier": "shell:allow-execute",
"allow": [
{
"name": "git",
"cmd": "git",
"args": ["status", "log", "diff"]
}
]
}
七、权限组 #
7.1 定义权限组 #
json
{
"identifier": "file-operations",
"description": "File operations permission group",
"permissions": [
"fs:allow-read-text-file",
"fs:allow-write-text-file",
"fs:allow-read-dir",
"fs:allow-exists"
]
}
7.2 使用权限组 #
json
{
"permissions": [
"file-operations"
]
}
八、权限继承 #
8.1 继承默认权限 #
json
{
"identifier": "extended",
"extends": ["default"],
"permissions": [
"fs:allow-write-text-file"
]
}
8.2 覆盖权限 #
json
{
"identifier": "restricted",
"extends": ["default"],
"permissions": [
"fs:deny-write-text-file"
]
}
九、最佳实践 #
9.1 最小权限原则 #
json
// ✅ 好:只授予需要的权限
{
"permissions": [
"fs:allow-read-text-file"
]
}
// ❌ 差:授予过多权限
{
"permissions": [
"fs:default"
]
}
9.2 权限分离 #
json
// 只读窗口
{
"identifier": "viewer",
"windows": ["viewer"],
"permissions": [
"fs:allow-read-text-file"
]
}
// 编辑窗口
{
"identifier": "editor",
"windows": ["editor"],
"permissions": [
"fs:allow-read-text-file",
"fs:allow-write-text-file"
]
}
9.3 权限审计 #
bash
# 检查权限配置
cargo tauri permission list
# 验证权限
cargo tauri permission verify
十、总结 #
10.1 核心要点 #
| 要点 | 说明 |
|---|---|
| Capability | 定义窗口能力 |
| Permission | 具体权限 |
| Scope | 权限范围 |
| 最小权限 | 只授予必要权限 |
| 权限分离 | 不同窗口不同权限 |
10.2 下一步 #
现在你已经掌握了权限控制,接下来让我们学习 CSP配置,深入了解内容安全策略!
最后更新:2026-03-28