BÀI 14: MIDDLEWARE & BẢO VỆ ROUTE TRONG NUXT

jk5587725

By jk5587725

Đăng ngày Tháng 7 8, 2025

Tiếp theo là Bài 14 – Middleware và bảo vệ route trong NuxtJS. Middleware cho phép bạn kiểm soát luồng truy cập trang – ví dụ: kiểm tra đăng nhập, phân quyền, redirect nếu không đủ điều kiện.


1. Middleware là gì?

  • Middleware là các hàm chạy trước khi trang được render
  • Dùng để kiểm tra điều kiện → quyết định cho vào trang hay redirect
  • Có thể áp dụng cho toàn trang (global) hoặc từng page riêng (route middleware)

2. Tạo middleware cơ bản

Tạo file: middleware/auth.global.ts

export default defineNuxtRouteMiddleware((to, from) => {
  const isLoggedIn = useCookie('auth_token').value

  // Kiểm tra nếu user chưa login và đang truy cập /admin
  if (!isLoggedIn && to.path.startsWith('/admin')) {
    return navigateTo('/login')
  }
})
  • useCookie() kiểm tra cookie đăng nhập
  • navigateTo() để redirect
  • Tên file có .global.ts để áp dụng cho mọi trang

3. Middleware áp dụng riêng từng trang

Nếu bạn chỉ muốn middleware cho một page, hãy:

Tạo file: middleware/only-admin.ts

export default defineNuxtRouteMiddleware(() => {
  const token = useCookie('auth_token').value

  if (!token) {
    return navigateTo('/login')
  }
})

Sau đó trong pages/admin/index.vue:

<script setup>
definePageMeta({
  middleware: 'only-admin'
})
</script>

4. Middleware async

Bạn có thể gọi API, ví dụ kiểm tra token hợp lệ:

export default defineNuxtRouteMiddleware(async () => {
  const token = useCookie('auth_token').value

  const valid = await $fetch('/api/validate-token', {
    method: 'POST',
    body: { token }
  })

  if (!valid) {
    return navigateTo('/login')
  }
})

5. Middleware client-only

Mặc định middleware chạy cả server & client. Nếu muốn chỉ chạy phía client:

export default defineNuxtRouteMiddleware((to, from) => {
  if (process.client) {
    // logic client-side
  }
})

6. Dùng middleware để ngăn vào trang đã login

Ví dụ: Nếu đã login, không cho vào /login nữa

export default defineNuxtRouteMiddleware(() => {
  const token = useCookie('auth_token').value
  if (token) {
    return navigateTo('/')
  }
})

Áp dụng cho pages/login.vue:

<script setup>
definePageMeta({
  middleware: 'guest-only'
})
</script>

7. Dùng nhiều middleware cùng lúc

<script setup>
definePageMeta({
  middleware: ['only-admin', 'other-check']
})
</script>

Nuxt sẽ chạy lần lượt các middleware được liệt kê.


Bạn đã học được

  • Tạo middleware toàn cục hoặc riêng từng trang
  • Kiểm tra cookie, gọi API trong middleware
  • Redirect người dùng nếu chưa đăng nhập
  • Bảo vệ các route như /admin khỏi truy cập trái phép
  • Sử dụng nhiều middleware cùng lúc để phân quyền nâng cao

Bài tập mở rộng

  1. Tạo middleware only-auth.ts → bảo vệ /admin
  2. Tạo middleware guest-only.ts → chặn user đã login truy cập /login
  3. Tạo cookie giả lập auth_token sau khi login thành công để test

📂 Chuyên mục:

Thảo luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Đăng ký nhận tin mới

Nhận bài học, tài nguyên và cơ hội việc làm qua email hàng tuần.

[global_subscribe_form]

Chúng tôi cam kết không spam. Bạn có thể hủy bất cứ lúc nào.