Vue實(shí)現(xiàn)不同用戶(hù)權(quán)限的方法詳解
在項(xiàng)目中,實(shí)現(xiàn)不同用戶(hù)的權(quán)限控制是常見(jiàn)的需求也是常見(jiàn)的功能模塊,例如管理系統(tǒng)中不同角色(管理員、普通用戶(hù)等)應(yīng)有不同的訪問(wèn)權(quán)限,小程序、App等在不同角色登入的時(shí)候顯示的首頁(yè)以及跳轉(zhuǎn)訪問(wèn)不同的頁(yè)面。本文將以 vue 為主要的代碼框架介紹幾種常見(jiàn)的權(quán)限控制方式。
1. 基于路由守衛(wèi)的權(quán)限控制
1.1 方案概述
基于 Vue Router 的 beforeEach 進(jìn)行全局路由守衛(wèi)控制。我們可以在 vuex 或 pinia 中存儲(chǔ)用戶(hù)角色,并在路由的 meta 字段中定義允許訪問(wèn)的角色。
1.2 實(shí)現(xiàn)步驟
- 在
router配置中為每個(gè)路由添加meta字段,存儲(chǔ)允許訪問(wèn)的角色。 - 在 Vuex/Pinia 中存儲(chǔ)用戶(hù)角色。
- 使用
router.beforeEach進(jìn)行權(quán)限校驗(yàn)。
1.3 代碼示例
// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import store from '@/store';
// 引入多個(gè)組件頁(yè)面
import Home from '@/views/Home.vue';
import Admin from '@/views/Admin.vue';
import AddSomeFun from '@/views/AddSomeFun.vue';
import Login from '@/views/Login.vue';
// 定義路由,并且在 meta 中定義可訪問(wèn)的角色
const routes = [
{ path: '/', component: Home },
{ path: '/admin', component: Admin, meta: { roles: ['admin'] } },
{ path: '/addSomeFun', component: AddSomeFun, meta: { roles: ['user'] } },
{ path: '/login', component: Login }
];
// 創(chuàng)建路由
const router = createRouter({
history: createWebHistory(),
routes
});
// 路由校驗(yàn)
router.beforeEach((to, from, next) => {
const userRole = store.state.userRole; // 假設(shè) Vuex 中存儲(chǔ)了用戶(hù) user、管理員 admin 角色
if (to.meta.roles && !to.meta.roles.includes(userRole)) {
next('/'); // 無(wú)權(quán)限跳轉(zhuǎn)到首頁(yè)
} else {
next();
}
});
export default router;
2. 基于 Vue 指令的權(quán)限控制
2.1 方案概述
使用 Vue 指令 v-permission 來(lái)控制按鈕、組件或模塊的顯示隱藏。
2.2 實(shí)現(xiàn)步驟
- 在 Vue 全局創(chuàng)建一個(gè)自定義指令
v-permission。 - 在 main.js 引入注冊(cè)。
- 該指令根據(jù)用戶(hù)權(quán)限判斷是否顯示該元素。
2.3 代碼示例
// directives/permission.js
// 指令封裝
import { useStore } from 'vuex';
export default {
install(app) {
app.directive('permission', {
mounted(el, binding) {
const store = useStore();
const userRole = store.state.userRole;
if (!binding.value.includes(userRole)) {
el.parentNode?.removeChild(el);
}
}
});
}
};
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';
import permissionDirective from './directives/permission';
const app = createApp(App);
app.use(store);
app.use(permissionDirective); // 注冊(cè)自定義指令
app.mount('#app');
<!-- 使用示例 --> <button v-permission="['admin']">僅管理員可見(jiàn)</button>
3. 基于 Vuex(或 Pinia)的權(quán)限控制
3.1 方案概述
在 Vuex/Pinia 中存儲(chǔ)權(quán)限信息,并在組件中通過(guò) computed 計(jì)算屬性動(dòng)態(tài)控制組件或按鈕的顯示。
3.2 代碼示例
// store/index.js
import { createStore } from 'vuex';
export default createStore({
state: {
userRole: 'user' // 假設(shè)存儲(chǔ)用戶(hù)角色
},
mutations: {
setUserRole(state, role) {
state.userRole = role;
}
}
});
<!-- 在組件中使用 Vuex 進(jìn)行權(quán)限判斷 -->
<template>
<button v-if="userRole === 'admin'">僅管理員可見(jiàn)</button>
</template>
<script>
import { computed } from 'vue';
import { useStore } from 'vuex';
export default {
setup() {
const store = useStore();
const userRole = computed(() => store.state.userRole);
return { userRole };
}
};
</script>
4. 后端返回權(quán)限控制
4.1 方案概述
后端返回權(quán)限控制的方式有兩種:
- 返回用戶(hù)權(quán)限信息:前端獲取角色信息后,使用前述方法進(jìn)行權(quán)限控制。
- 后端返回可訪問(wèn)路由:后端返回用戶(hù)可以訪問(wèn)的路由列表,前端使用
router.addRoute動(dòng)態(tài)注冊(cè)。
4.2 代碼示例(后端返回路由)
// 登錄后獲取用戶(hù)權(quán)限,并動(dòng)態(tài)添加路由
import router from '@/router';
import store from '@/store';
import axios from 'axios';
async function fetchUserRoutes() {
const res = await axios.post('/common/getUserRoutes'); // 假設(shè)后端返回路由信息
const routes = res.data
routes.forEach(route => {
router.addRoute(route);
});
}
fetchUserRoutes();
5. 總結(jié)
| 方法 | 適用場(chǎng)景 | 優(yōu)勢(shì) | 缺點(diǎn) |
|---|---|---|---|
| 路由守衛(wèi) | 頁(yè)面級(jí)權(quán)限控制 | 適用于完整頁(yè)面權(quán)限 | 無(wú)法控制按鈕等細(xì)節(jié) |
| Vue 指令 | 組件、按鈕級(jí)權(quán)限 | 適用于 UI 級(jí)別權(quán)限 | 需要手動(dòng)移除元素 |
| Vuex/Pinia | 組件級(jí)權(quán)限 | 適用于靈活權(quán)限判斷 | 需要在多個(gè)組件中維護(hù)權(quán)限邏輯 |
| 后端返回權(quán)限 | 適用于大規(guī)模權(quán)限管理 | 后端統(tǒng)一管理,靈活 | 需要?jiǎng)討B(tài)更新前端路由 |
以上幾種方式可以結(jié)合使用,根據(jù)實(shí)際業(yè)務(wù)需求選擇合適的權(quán)限控制方式。
到此這篇關(guān)于Vue實(shí)現(xiàn)不同用戶(hù)權(quán)限的方法詳解的文章就介紹到這了,更多相關(guān)Vue用戶(hù)權(quán)限內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue項(xiàng)目設(shè)置多個(gè)靜態(tài)文件及自定義靜態(tài)文件目錄的方案詳解
本文介紹了如何在Vue項(xiàng)目中配置多個(gè)靜態(tài)文件目錄,并提供了使用Vite和Webpack實(shí)現(xiàn)的示例,通過(guò)在vite.config.ts或vue.config.js中引入相關(guān)插件和配置,可以輕松實(shí)現(xiàn)自定義靜態(tài)文件目錄,希望這些內(nèi)容對(duì)您有所幫助,感興趣的朋友一起看看吧2025-01-01
webpack + vue 打包生成公共配置文件(域名) 方便動(dòng)態(tài)修改
這篇文章主要介紹了webpack + vue 打包生成公共配置文件(域名) 方便動(dòng)態(tài)修改,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
vue3超出文本展示el tooltip實(shí)現(xiàn)示例
這篇文章主要為大家介紹了vue3超出文本展示el tooltip實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
vue實(shí)現(xiàn)無(wú)縫滾動(dòng)手摸手教程
這篇文章主要為大家介紹了vue實(shí)現(xiàn)無(wú)縫滾動(dòng)手摸手教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

