权限控制 #

一、权限系统概述 #

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