iT邦幫忙

2026 iThome 鐵人賽

DAY 20
0
佛心分享-IT 人自學之術

老爺爺練習VIBE CODING系列 第 20

Day 20:Tauri v2 的安全哲學:能力模型(Capability)與自訂無邊框 UI

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260829/20070969miOBpGWXTt.png
(端起茶杯,看著天邊那一抹如晚霞暮紫般絢爛的餘暉,輕輕搖了搖身下這把老舊的藤椅深棕)。

大孫女、小孫女,快過來,別在院子裡跑得滿頭大汗了,來爺爺身邊坐下。喝口剛倒好的琥珀熱茶,爺爺用我這白髮銀霜腦袋瓜裡裝的老故事,繼續給你們講講咱們昨天還沒說完的「輕竹籃」。

昨天啊,我們聊到怎麼用 Tauri 打造超輕量的跨平台桌面程式。看著大孫女聽得津津有味、小孫女在旁邊拉著爺爺的衣角撒嬌,爺爺心裡真是高興。今天,我們緊接著進入 Day 20:Tauri v2 的安全哲學:能力模型(Capability)與自訂無邊框 UI

這堂課啊,用爺爺大半輩子的生活智慧來講,就是 「如何給精緻的竹編籃裝上一把既牢固又靈巧的銅鎖,同時把它雕琢得像宮廷裡一樣雅致」


🚨 痛點場景:別讓漂亮的玻璃窗,成了小偷的方便之門

大孫女,妳平時用電腦時可能沒想過,這桌面軟體因為是在本機電腦執行,所以擁有極高的權限。它能隨意讀寫妳的硬碟檔案、執行系統命令,甚至能控制整個作業系統。

現在很多年輕人喜歡用網頁技術(HTML/JS)來做介面。但網頁這個東西啊,就像一扇精美的雕花玻璃窗,雖然好看,但也容易被壞人盯上。如果妳寫的前端網頁不小心被植入了惡意腳本(也就是大家常說的跨站腳本攻擊 XSS),而在傳統的桌面架構下,這個惡意腳本就等於直接繼承了系統的高權限!這下可糟了,駭客能直接透過這個漏洞,把妳整台電腦的隱私檔案偷得精光,整個系統瞬間就會被外人給控制了。

這就像是,妳把自家的圍牆造得又高又結實,卻在玻璃窗上留了一個大洞,還把保險箱的鑰匙掛在窗邊一樣危險。所以,我們必須要有一套萬無一失的保全規矩。


🛠️ 架構實作:雙重防禦的能力模型與自訂雅致外觀

在 Tauri v2 的世界裡,它為了防範這種危機,設計了一套非常嚴格且聰明的防禦機制,這就是爺爺想跟你們說的兩個核心工藝:

1. Capability 安全模型:進廚房就拿不走書房的鑰匙

Tauri v2 引入了非常嚴格的權限防禦機制。這個機制叫做 Capability(能力模型)

爺爺常說,治家要有規矩。如果家裡來了幫忙炊煮的臨時工,我們只會給他廚房的鑰匙,絕對不會連書房、保險箱的鑰匙也一併塞給他,這就是「最小權限原則」。

  • 明確宣告:在開發時,妳必須在 capabilities/*.json(能力設定檔)中,明確宣告前端介面可以調用哪些 Rust 後端指令
  • 精細控管:例如,妳可以設定「只允許前端讀取 $DOCUMENT(文件夾)或 $APPDATA(應用程式資料夾)裡的特定格式檔案」,而且嚴禁使用像 fs:allow-all 這種貪圖方便、把所有權限都打開的寬鬆設定
  • 後端防守:前端發出的所有請求,在跨越邊界(IPC)時,都必須經過白名單與參數驗證。只要是未經授權的調用,後端的 Rust 衛兵會二話不說,直接在大門口攔截下來,保護電腦的安全。

2. 自訂無邊框 UI:把笨重的木框換成無邊的優雅

現代的軟體,大家都講求「高質感、無邊框」的精緻視覺。為了打造出這種現代化界面,我們通常會在設定檔中把 decorations 設為 false。這樣一來,作業系統內建那種厚重、呆板的視窗外框與標題列就會被隱藏起來

但是,一旦把這個外框拿掉,大孫女妳就會發現: 視窗動不了了! 因為原生視窗用來拖曳移動、最小化、最大化與關閉的控制按鈕,全部跟著那個框一起消失了。這時候,我們就必須自己動手:

  • 網頁頂部手動實作:我們得在網頁最頂端,用網頁元素手動畫出一條「自訂標題列(Custom Titlebar)」,並利用 Tauri 提供的視窗 API(Window APIs),把拖曳(Drag)、最小化、最大化與關閉按鈕的功能一一綁定上去,完美保留使用者習慣的所有視窗行為。
  • 精美托盤選單(System Tray):為了不讓程式一按關閉就完全退出,我們可以設計一個精美的系統托盤。當使用者點擊關閉時,程式只是安安靜靜地縮到電腦右下角的托盤裡,右鍵選單還可以提供「顯示主視窗」、「設定」或「完全退出」等靈活選項。這就像是把大竹籃收在屋簷下,需要時隨時可以提著走。

💡 避坑指南:拖曳區域的「鬼擋牆」

不過啊,大孫女,在做這個自訂無邊框 UI 的時候,許多年輕人都踩過同一個大坑。爺爺在這裡給妳指條明路,免得妳到時候折騰半天:

為了讓使用者能拖曳整個視窗,我們會把自訂標題列的整個網頁區域設定為「可拖曳區域」(這在 Tauri 裡通常是加上 data-tauri-drag-region 屬性)。

這時候問題來了: 如果妳在這個拖曳區域裡面,放了其他可以點擊的按鈕或搜尋框,使用者會發現這些按鈕「完全點不到」! 因為每當使用者的滑鼠點下去時,系統會以為使用者是要「拖曳移動視窗」,這個拖曳事件會直接把點擊事件給拦截、吃掉。

【爺爺的避坑對策】
當妳需要在標題列放搜尋框或功能按鈕時,一定要在這些可點擊的 HTML 元素上,加上特定的類名排除拖曳,或者在 JS 裡面寫上 stopPropagation() 阻止事件冒泡。這樣一來,網頁才會知道:「這裡不能拿來拖視窗,這是要讓我點擊用的!」這樣按鈕才能重新恢復正常運作。


(天色漸漸暗了,院子裡的晚風吹過,茶香也愈發濃郁。寫程式、做軟體啊,就跟爺爺編一輩子竹籃是一樣的道理,外表要雕琢得優雅現代,內在的骨架與防護更要踏實穩固。)


上一篇
Day 19:Electron 終結者?用 Tauri v2 + Rust 打造超輕量跨平台桌面應用
下一篇
Day 21:突破人工排班極限:用 Google OR-Tools CP-SAT 求解複雜醫療排班
系列文
老爺爺練習VIBE CODING25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言