10
Re:Nuxt 100 天練習曲
Day 10

網站的保全系統 (路由守衛)

Day 10·路由中介軟體·安全驗證

今天我們要學習兩個進階的路由技巧:路由中介軟體 (Route Middleware)路由驗證 (Route Validation)

1. 路由中介軟體:頁面的保全人員

你可以把「中介軟體」想像成是每個房間門口的保全人員

在使用者進入一個頁面之前,這位保全會先攔下來檢查,看看他/她是否符合通行資格。最經典的例子就是:「這個頁面需要登入才能看!」

如何建立保全 (Middleware)?

1

建立檔案

middleware/ 資料夾中建立一個檔案,例如 auth.ts

(檔案名稱會被轉換成小寫橫槓命名,例如 authMiddlewareauth-middleware)

2

撰寫規則

在檔案中,我們定義檢查的邏輯。如果檢查不通過,就用 navigateTo 把它導向登入頁。

middleware/auth.ts
// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
  // 這裡只是一個範例,實際情況會是檢查 cookie 或 token
  const hasLoggedIn = false;

  if (!hasLoggedIn) {
    // 如果沒登入,就強制導向到登入頁
    return navigateTo('/login');
  }
})
3

派遣保全

在需要保護的頁面 (例如 dashboard.vue) 中,使用 definePageMeta 來派遣這位保全。

pages/dashboard.vue
<script setup>
definePageMeta({
  // 告訴 Nuxt:進入此頁面前,必須先通過 'auth' 這個保全的檢查
  middleware: 'auth'
})
</script>

<template>
  <h1>這是您的會員儀表板</h1>
</template>

2. 路由驗證:通行規則檢查員

「路由驗證」的任務更單純,它像是規則檢查員,專門用來檢查網址參數的格式是否正確。

例如,在 pages/posts/[id].vue 中,我們預期 id 應該是數字。如果有人訪問 /posts/hello,這顯然不合理,應該直接給他一個 404 找不到頁面的錯誤。

如何設定規則 (Validation)?

直接在頁面中使用 definePageMetavalidate 屬性。

pages/posts/[id].vue
<script setup>
definePageMeta({
  validate: (route) => {
    // 檢查 route.params.id 是否完全由數字組成
    const isIdNumeric = /^\d+$/.test(route.params.id);
    return isIdNumeric; // 如果是數字,回傳 true (通過);否則回傳 false (顯示 404)
  }
})
</script>

<template>
  <p>文章 ID: {{ $route.params.id }}</p>
</template>

今日總結

今天我們學會了保護網站的兩大招式:

中介軟體 (保全):檢查權限,例如「你登入了嗎?」。

負責將不符資格的人引導到別處。

路由驗證 (規則檢查員):檢查格式,例如「這個 ID 是數字嗎?」。

負責擋掉格式不符的無效訪問。

學會了這兩招,你的網站不僅有結構,還有了智慧和安全性,變得更加專業和穩固!

特性中介軟體 (Middleware)路由驗證 (Validation)
主要用途權限檢查格式驗證
檢查對象使用者狀態網址參數
失敗行為導向其他頁面顯示 404 錯誤
設定位置middleware/ 資料夾頁面檔案內
使用場景登入驗證、角色權限ID 格式、參數合法性

中介軟體範例

  • • 會員專區登入檢查
  • • 管理員權限驗證
  • • 付費內容存取控制
  • • 地區限制檢查

路由驗證範例

  • • 文章 ID 必須是數字
  • • 用戶名格式驗證
  • • 日期格式檢查
  • • 語言代碼驗證