在桌面应用开发中,安全性至关重要。相比 Electron,Tauri 2.0 提供了更严格的安全模型和更完善的权限系统。本文将帮助你理解和实践 Tauri 的安全特性。
权限系统对比
Electron 的安全模型
在 Electron 中,我们通常这样处理安全:
// main.js
const { app, BrowserWindow } = require('electron')
function createWindow() {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
sandbox: true
}
})
// 加载本地文件
win.loadFile('index.html')
}
app.whenReady().then(() => {
createWindow()
})
主要特点:
- 上下文隔离
- 沙箱机制
- CSP 策略
- 手动配置
Tauri 的安全模型
Tauri 采用了更严格的安全策略:
// main.rs
use tauri::Manager;
use tauri::api::path::app_dir;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
struct Permissions {
fs_access: bool,
network_access: bool,
shell_access: bool,
}
#[tauri::command]
async fn check_permissions(
app: tauri::AppHandle
) -> Result<Permissions, String> {
let perms = Permissions {
fs_access: app.fs_scope().is_allowed("path/to/check"),
network_access: app.runtime_handle().is_allowed("network"),
shell_access: app.runtime_handle().is_allowed("shell")
};
Ok(perms)
}
fn main() {
tauri::Builder::default()
.setup(|app| {
// 配置安全策略
app.manage(tauri::SecurityConfig::default()
.with_csp("default-src 'self'")
.with_dangerous_allow_asset_csp_modification(false)
);
Ok(())
})
.invoke_handler(tauri::generate_handler![
check_permissions
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
// security.ts
import { invoke } from '@tauri-apps/api/tauri'
interface Permissions {
fs_access: boolean
network_access: boolean
shell_access: boolean
}
export const checkPermissions = async (): Promise<Permissions> => {
try {
return await invoke('check_permissions')
} catch (error) {
console.error('Failed to check permissions:', error)
throw error
}
}

最低0.47元/天 解锁文章
1903

被折叠的 条评论
为什么被折叠?



