使用 Vue 實現頁面訪問攔截

来源:https://www.cnblogs.com/chenyuanrumeng/archive/2023/08/09/17616132.html
-Advertisement-
Play Games

在現代的 Web 應用程式中,頁面訪問攔截是非常重要的一個方面。它可以用於確保用戶只能訪問他們有許可權的頁面,提高應用程式的安全性和用戶體驗。本篇博文將介紹如何使用 Vue 框架來實現頁面訪問攔截的功能。 ...


目錄

1 Vue 路由與導航守衛

1.1 Vue 路由簡介

Vue 路由是用於構建單頁應用程式(SPA)的官方路由庫。它允許開發者根據不同的 URL 地址,將頁面切換到對應的組件上,實現頁面之間的無刷新跳轉。

在 Vue 路由中,我們可以定義一組路由規則,每個路由規則都映射一個 URL 地址和對應的組件。當用戶訪問某個 URL 地址時,路由會根據配置的規則找到匹配的組件,並將其渲染到指定的位置。

Vue 路由提供了多種導航方式,包括普通的鏈接跳轉、編程式導航以及通過瀏覽器前進和後退按鈕進行導航等。

1.2 導航守衛概述

導航守衛是 Vue 路由提供的一種功能,用於在路由切換過程中進行控制和管理。它可以讓開發者在路由切換前、切換後或者切換取消時執行一些特定的邏輯操作。

導航守衛主要有以下幾個鉤子函數:

  • beforeEach: 在每次路由切換前被調用,可以用來進行全局的許可權驗證或其他前置操作。
  • afterEach: 在每次路由切換後被調用,可以用來進行統計或其他後置操作。
  • beforeResolve: 在每次路由切換前被調用,與beforeEach類似,但在全局 afterEach 調用之前被調用。
  • beforeEnter: 在單個路由配置中定義的鉤子函數,在進入該路由前被調用。

此外,還有兩種特殊的導航守衛:

  • beforeRouteUpdate: 在當前路由復用時調用,比如從 /user/1 導航到 /user/2
  • beforeRouteLeave: 在離開當前路由前調用,可以用來提示用戶保存未保存的數據。

通過使用導航守衛,我們可以實現諸如登錄驗證、許可權控制、頁面跳轉攔截等功能。

2 實現訪問攔截的核心概念

2.1 路由守衛介紹

2.1.1 前置守衛(beforeEach

前置守衛是在路由切換前被調用的鉤子函數。可以通過註冊全局前置守衛或者在單個路由配置中定義的 beforeEnter 鉤子來實現。

使用前置守衛可以進行一些全局的許可權驗證或其他前置操作,例如檢查用戶是否登錄、校驗用戶許可權等。如果需要阻止當前導航,則可以調用 next(false)

2.1.2 後置鉤子(afterEach

後置鉤子是在路由切換後被調用的鉤子函數。它沒有能力改變導航本身,只能做一些統計或其他後置操作。

後置鉤子不接收 next 函數參數,因為無法改變導航。

2.1.3 解析守衛(beforeResolve

解析守衛是在路由組件準備就緒之前被調用的鉤子函數。它類似於全局前置守衛,但在全局 afterEach 調用之前被調用。

解析守衛可以用來處理非同步路由組件的載入過程,確保在渲染組件之前獲取到必要的數據。

2.2 鑒權邏輯設計

鑒權(Authorization)是基於許可權的訪問控制系統的核心概念。在設計鑒權邏輯時,通常需要考慮以下幾個方面:

  1. 角色與許可權的定義:確定系統中的角色和對應的許可權,並將其進行清晰的定義和劃分。

  2. 用戶認證:實現用戶登錄驗證機制,確保只有經過認證的用戶才能訪問受限資源。

  3. 路由許可權控制:根據用戶的角色和許可權,在路由導航守衛中進行許可權驗證,決定是否允許用戶訪問某個頁面或執行某個操作。

  4. 組件級別的許可權控制:在組件內部根據用戶的角色和許可權,動態展示或隱藏特定功能模塊或按鈕。

  5. 後端介面許可權控制:在後端介面層面進行許可權驗證,防止未經授權的請求訪問敏感數據或執行重要操作。

通過合理設計和實現鑒權邏輯,可以有效地保護系統的安全性和數據的完整性。

2.3 登錄驗證機制

利用 Vue 路由導航守衛可以很方便地實現用戶登錄驗證機制。

首先,在全局前置守衛(beforeEach)中檢查用戶是否已登錄。如果用戶未登錄,則可以使用 next('/login') 將用戶重定向到登錄頁面。

router.beforeEach((to, from, next) => {
  const isLoggedIn = checkUserLoggedIn(); // 檢查用戶是否已登錄
  if (to.meta.requiresAuth && !isLoggedIn) {
    next('/login'); // 重定向到登錄頁面
  } else {
    next(); // 繼續導航
  }
});

在需要進行登錄驗證的路由配置中,可以通過 meta 欄位指定該路由需要進行許可權驗證。

const routes = [
  {
    path: '/dashboard',
    component: Dashboard,
    meta: { requiresAuth: true } // 需要登錄驗證
  },
  // 其他路由配置...
];

這樣,在用戶訪問 /dashboard 路徑時,會先觸發全局前置守衛進行登錄驗證。如果用戶未登錄,則會被重定向到登錄頁面;如果用戶已登錄,則會繼續導航到目標頁面。

通過以上方式,我們可以很方便地實現基於 Vue 路由導航守衛的用戶登錄驗證機制。

3 實現頁面訪問攔截的步驟

3.1 路由配置

在 Vue 路由中,通過設置路由守衛規則來實現頁面訪問攔截。可以在需要攔截的頁面配置相應的守衛。

首先,在項目的路由文件(通常是 router.js)中引入 Vue Router,並創建一個新的 Router 實例。

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

const router = new VueRouter({
  routes: [
    // 路由配置信息
  ]
})

然後,在路由配置中為需要攔截的頁面添加守衛。

const router = new VueRouter({
  routes: [
    {
      path: '/login',
      component: Login
    },
    {
      path: '/dashboard',
      component: Dashboard,
      meta: { requiresAuth: true } // 添加 requiresAuth 元欄位表示需要登錄驗證
    }
  ]
})

在上面的代碼中,'/dashboard'路徑的組件 Dashboard 需要進行登錄驗證。

3.2 守衛函數編寫

接下來,編寫前置守衛函數,用於實現登錄驗證和許可權校驗的邏輯。

router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth && !isAuthenticated()) {
    next('/login') // 如果需要登錄驗證且未登錄,則跳轉到登錄頁面
  } else {
    next() // 否則繼續導航
  }
})

function isAuthenticated() {
  // 進行登錄驗證的邏輯,返回 true 表示已登錄,false 表示未登錄
}

在上面的代碼中,beforeEach 函數是全局前置守衛,會在每次路由切換前執行。我們可以在其中進行登錄驗證的邏輯判斷。

如果 to.meta.requiresAuth 為 true 且用戶未登錄(isAuthenticated()返回 false),則通過 next('/login')跳轉到登錄頁面。否則,調用 next()繼續導航到目標頁面。

3.3 攔截處理

最後,在攔截處理部分,根據需要攔截的情況,進行相應的跳轉或提示。

在上述代碼中,當需要登錄驗證且用戶未登錄時,會通過 next('/login')將用戶重定向到登錄頁面。

你還可以根據具體需求進行其他攔截處理,比如許可權校驗、訪問限制等。

這樣,就完成了基本的頁面訪問攔截實現。

4 示例演示

4.1 創建 Vue 項目

要創建一個簡單的 Vue 項目,您可以使用 Vue CLI(命令行界面)來快速搭建項目結構。以下是使用 Vue CLI 創建 Vue 項目的步驟:

  1. 首先,確保您已經安裝了 Node.js 和 npm(Node 包管理器)。您可以在終端中運行以下命令來檢查它們是否已安裝:

    node -v
    npm -v
    
  2. 如果 Node.js 和 npm 未安裝,請前往 Node.js 官網(https://nodejs.org/)下載並安裝。

  3. 接下來,全局安裝 Vue CLI。在終端中運行以下命令:

    npm install -g @vue/cli
    
  4. 安裝完成後,您可以使用以下命令來創建一個新的 Vue 項目:

    vue create my-project
    

    在這個命令中,my-project 是您要創建的項目名稱,您可以根據實際情況進行更改。

  5. 運行上述命令後,Vue CLI 會提示您選擇一些配置選項。您可以使用上下箭頭鍵在選項之間進行選擇,並使用回車鍵進行確認。您可以選擇預設配置,或者根據需要進行自定義配置。

  6. 完成配置後,Vue CLI 會自動下載和安裝項目所需的依賴項。

  7. 安裝完成後,您可以使用以下命令進入項目目錄:

    cd my-project
    
  8. 最後,使用以下命令來啟動開發伺服器:

    npm run serve
    

    這將啟動開發伺服器,併在瀏覽器中打開項目。您可以在 http://localhost:8080(預設埠)上訪問您的 Vue 應用程式。

這樣,您就成功創建了一個簡單的 Vue 項目。您可以根據需要在項目中添加組件、路由、狀態管理等功能,並使用 Vue 的各種特性來開發您的應用程式。

4.2 配置頁面訪問攔截

要在 Vue 項目中添加路由守衛併進行相應的配置,可以按照以下步驟進行操作:

  1. 創建一個名為auth.js的新文件,併在其中定義一個名為AuthGuard的路由守衛類。
import { getToken } from './auth'; // 導入獲取 token 的方法

const AuthGuard = (to, from, next) => {
  const token = getToken(); // 獲取 token
  if (token) {
    // 如果存在 token,允許訪問該頁面
    next();
  } else {
    // 如果不存在 token,重定向到登錄頁面
    next('/login');
  }
};

export default AuthGuard;
  1. router/index.js文件中導入AuthGuard類,並將其添加到需要進行頁面訪問攔截的路由配置中。
import AuthGuard from '@/auth';

const routes = [
  {
    path: '/dashboard',
    component: DashboardComponent,
    beforeEnter: AuthGuard // 使用 beforeEnter 屬性指定路由守衛
  },
  {
    path: '/profile',
    component: ProfileComponent,
    beforeEnter: AuthGuard
  },
  ...
];

const router = new VueRouter({
  routes
});

export default router;

在上述示例中,AuthGuard路由守衛將會攔截對/dashboard/profile路徑的訪問,只有在存在 token 的情況下才允許訪問這些頁面。如果不存在 token,則會被重定向到登錄頁面。

4.3 演示登錄驗證

要演示登錄驗證並驗證訪問攔截的效果,可以按照以下步驟進行操作:

  1. auth.js文件中添加一個名為login的方法,用於模擬用戶登錄並保存 token。
export const login = (username, password) => {
  // 模擬登錄請求,驗證用戶名和密碼
  if (username === 'admin' && password === 'password') {
    // 登錄成功,保存 token 到 localStorage
    localStorage.setItem('token', 'your_token_here');
    return true;
  } else {
    // 登錄失敗
    return false;
  }
};
  1. auth.js文件中添加一個名為getToken的方法,用於獲取保存在 localStorage 中的 token。
export const getToken = () => {
  return localStorage.getItem('token');
};
  1. 在登錄頁面的組件中,使用login方法進行用戶登錄,並根據登錄結果進行相應的處理。
import { login } from '@/auth';

export default {
  data() {
    return {
      username: '',
      password: ''
    };
  },
  methods: {
    handleLogin() {
      const { username, password } = this;
      const loggedIn = login(username, password);
      if (loggedIn) {
        // 登錄成功,跳轉到首頁或其他需要登錄的頁面
        this.$router.push('/dashboard');
      } else {
        // 登錄失敗,顯示錯誤提示
        alert('登錄失敗,請檢查用戶名和密碼');
      }
    }
  }
};
  1. 在需要進行頁面訪問攔截的路由配置中,使用beforeEnter屬性指定路由守衛。
import AuthGuard from '@/auth';

const routes = [
  {
    path: '/dashboard',
    component: DashboardComponent,
    beforeEnter: AuthGuard
  },
  {
    path: '/profile',
    component: ProfileComponent,
    beforeEnter: AuthGuard
  },
  ...
];

在上述示例中,login方法模擬用戶登錄,並將 token 保存在 localStorage 中。在登錄頁面的組件中,調用login方法進行登錄,並根據登錄結果進行相應的處理。在需要進行頁面訪問攔截的路由配置中,使用beforeEnter屬性指定路由守衛。

5 總結

在這篇技術博客中,我們學習瞭如何使用 Vue 實現頁面訪問攔截。頁面訪問攔截是一種常見的安全措施,可以確保只有經過身份驗證的用戶才能訪問特定頁面或執行特定操作。

通過 Vue 的導航守衛功能,我們可以在路由切換之前進行攔截,並根據需要進行身份驗證或許可權檢查。通過使用 beforeEach 導航守衛,我們可以在每次路由切換之前執行自定義邏輯。

在這篇博客中,我們演示瞭如何創建一個簡單的登錄頁面,並使用導航守衛來阻止未經身份驗證的用戶訪問受保護的頁面。我們還介紹瞭如何使用 Vue 的路由功能來設置路由和導航守衛。

通過這個示例,我們可以看到 Vue 的靈活性和強大性,使我們能夠輕鬆地實現頁面訪問攔截功能。這對於構建安全的 Web 應用程式至關重要。

希望這篇博客對您有所幫助,併為您提供了使用 Vue 實現頁面訪問攔截的基礎知識。如果您對此感興趣,可以進一步探索 Vue 的其他功能和擴展,以提升您的開發技能和構建更安全的應用程式。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 一、前言 原有的業務系統跑在MySQL主從架構中,高可用通過腳本完成,但存在切換數據丟失和切換不及時風險,調研了高可用更穩定的MGR後,準備入手一試。本篇文章主要記錄GreatSQL從單機擴展到MGR的詳細過程,遇到的問題及解決方法。 # 二、基礎環境 伺服器角色如下 | IP | 埠 | 主 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230807132720267-1631745639.png) # 1. 計算一年有多少天 ## 1.1. Oracle sql語句實例 ```sql select 'Days ...
  • 一、升級webview版本 (1). 下載需要更新的Webview apk。如果不能翻牆可以用下載好的版本(相容32/64位):Webview-115.0.5790.138 (2). 在路徑\aosp\external\chromium-webview\prebuilt\下替換arm或arm64架構 ...
  • 本文介紹了Android13中的凍結進程功能,它是一種重要的資源管理策略,可以提高系統性能和穩定性,同時最大限度地節省設備的資源和電池消耗。 文章討論瞭如何合理分配資源,包括CPU、記憶體等,以提高設備性能和用戶體驗。此外,文章還提到了凍結進程對應用程式線程的影響,並介紹了Android13與Andr... ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 思路分析 在開始動手之前,分析一下整個功能的實現過程: 根據圖片大小創建 canvas1 畫布,並將原圖片直接定位在 canvas1 上; 在畫布上添加一個蒙層,以區分當前 canvas 圖像是被裁剪的原圖像; 在蒙層上方,對裁剪區域(鼠 ...
  • Avue 是一個基於Element-plus低代碼前端框架,它使用JSON 配置來生成頁面,可以減少頁面開發工作量,極大提升效率; 雖然Avue官網上面都有這些配置說明,但是如果剛開始接觸不熟悉框架的話需要很久才找到自己需要的參數配置,為了方便自己今後查找使用,現將一些開發中常用的配置梳理在下 一、 ...
  • 這幾天在學vue3, 用Element-plus 加 vue3 搭了個框架,在這裡記錄一下項目搭建中遇到的問題。 1、使用 Element-plus 的 icon 圖標,顯示不出來 首先,用命令行中安裝 Element-plus 的圖標: npm install @element-plus/icon ...
  • >我們是[袋鼠雲數棧 UED 團隊](http://ued.dtstack.cn/),致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。 >本文作者:景明 ## 升級背景 目前公司產品有關 react 的工具版本普遍較低,其中 react router ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...