Vue3的权限控制

本文介绍如何在Vue3中实现权限控制,通过自定义全局权限指令`v-perms`,结合后台传输的权限数据,动态显示或隐藏按钮。示例展示了新增、删除和导出操作的权限匹配逻辑,确保只有当用户具有全部对应权限时,按钮才会显示。

Vue3之权限控制

假设
新增有【‘sys:home:add1’,‘sys:home:edit’,‘sys:home:edit2’】这几个权限
删除有【‘sys:home:add’,‘sys:home:edit3’,‘sys:home:edit’】这几个权限
导出有【‘sys:home:add’,‘sys:home:edit’,‘sys:home:edit’】这几个权限

	<!-- 第一个权限与后台传输过来的就不匹配,所以不显示 -->
    <a-button v-perms="['sys:home:add1','sys:home:edit','sys:home:edit2']">新增</a-button>
    <!-- 其中有一个权限与后台传输过来的就不匹配,所以不显示 -->
    <a-button v-perms="['sys:home:add','sys:home:edit3','sys:home:edit']">删除</a-button>
    <!-- 所有的权限都是匹配的,才显示 -->
    <a-button v-perms="['sys:home:add','sys:home:edit','sys:home:edit']">导出</a-button>

在这里插入图片描述
最终代码

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'
import * as Icons from '@ant-design/icons-vue'

const app = createApp(App);

// 自定义一个全局权限指令 `v-perms`
app.directive('perms', (el, binding) => {
    const perms = binding.value; //按钮的权限
    const permissions = store.getters.getPermissions; //获取的权限集合
    if (perms.length > 0) {
        const hasPermission = perms.some((item: any) => {
            const flag = permissions.includes(item);
            if(!flag) {
                return true;
            }
        })
        if(hasPermission) {
            el.parentNode && el.parentNode.removeChild(el);
        }
    }
});

app.use(store).use(router).use(Antd).mount('#app')

// 全局使用图标
const icons: any = Icons;
for (const i in icons) {
    app.component(i, icons[i]);
}
Vue3进行token权限控制可从多个方面实现。在路由权限控制方面,涉及的技术栈有Vite + Vue3 + Axios + Vue Router 4 + Pinia,其路由权限控制流程为:通过路由守卫,在登录请求成功后获取token,进而获取权限路由。若路由不存在则跳转404页面;若路由存在且有token并有权限,则进行路由跳转;若没有权限则跳转403页面;若没有token,store重置并重新登录,若登录请求失败也会进行相应处理。路由配置包含静态路由和动态路由,例如首页、商户管理、商户列表等具体路由项,还包括登录、404、403等特殊路由[^1]。 在具体的token权限控制实现上,客户端登录时获取设备的设备号/mac地址,并将其作为参数传递到服务端。服务端接收到该参数后,用一个变量接收并将其作为Token保存在数据库,同时将该Token设置到session中。客户端每次请求时都统一拦截,将客户端传递的token和服务器端session中的token进行对比,相同则放行,不同则拒绝。此外,还需在路由中加入meta字段,用于记录页面是否需要做权限控制[^2]。 在token管理方面,可借助Pinia进行操作。示例代码如下: ```javascript import { ref } from &#39;vue&#39; import { defineStore } from &#39;pinia&#39; // 用户数据 export const useUserStore = defineStore( &#39;user&#39;, () => { const token = ref(&#39;&#39;) const refreshToken = ref(&#39;&#39;) // 设置 token const setToken = (access_token) => { token.value = access_token } // 设置刷新token const setRefreshToken = (refresh_token) => { refreshToken.value = refresh_token } // 删除Token const delToken = () => { token.value = &#39;&#39; } // 删除Token const delRefreshToken = () => { refreshToken.value = &#39;&#39; } return { token, refreshToken, setRefreshToken, setToken, delRefreshToken, delToken } } ) ``` 上述代码通过Pinia定义了一个用户数据存储,实现了token和刷新token的设置、删除等操作[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值