前端实现按钮级权限控制

假装这是后端返回的按钮路由权限,包含当前登录用户每个页面的按钮权限

let buttonAuth = [
    { path: '/test', btn: ['check', 'change'] }
    // ...
]

一共有四个权限:增(add),删(delete),改(change),查(check)。path指代的当前页面路由

自定义指令实现

在 Main.ts 文件中,声明自定义指令

// 假装此用户在tset页面只有 改 和 查 的按钮权限
let buttonAuth = [
    { path: '/test', btn: ['check', 'change'] }
    // ...
]
// 自定义指令: 控制按钮级权限
app.directive('permission', {
    mounted(el, binding) {
        // console.log(el) // 元素
        // console.log(binding.value) // 值
        // console.log(binding.arg) // 路由

        // 遍历按钮数组,根绝当前的路由找到这一项的按钮权限
        let btnAuth = buttonAuth.find(item => item.path === binding.arg)
        if (btnAuth) { // 找到了
            // 不包含此按钮权限就移除按钮或者禁用按钮,这里我直接移除了
            !btnAuth.btn.includes(binding.value) && el.parentNode.removeChild(el)
        }
    }
})

test页面

<template>
    <div>
        <el-button v-permission:[currentRoute]="'add'">增加</el-button>
        <el-button v-permission:[currentRoute]="'delete'">删除</el-button>
        <el-button v-permission:[currentRoute]="'change'">修改</el-button>
        <el-button v-permission:[currentRoute]="'check'">查看</el-button>
    </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { useRouter } from 'vue-router'

const router = useRouter()
// 获取当前的路由
const currentRoute = ref(router.currentRoute.value.path)
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端可以通过以下几种方式实现权限控制: 1. 方案一:在前端路由中添加前置路由守卫,通过判断用户的权限信息来控制路由跳转。可以在router.beforeEach中进行权限判断,如果用户没有相应的权限,则跳转到相应的页面(如自定义的401页面)。这种方案可以实现简单的权限控制,但不能实现真正的权限控制。\[1\] 2. 方案二:通过按钮控制来限制用户的操作权限。在组件中对一些按钮进行控制,如果用户没有相应的权限,则隐藏或禁用这些按钮。可以将这个逻辑放到自定义指令中,通过指令来控制按钮的显示或禁用状态。\[2\] 3. 方案三:根据用户的权限显示不同的侧边栏和限制其所能进入的页面。后端在每个涉及请求的操作中进行权限验证,验证用户是否有执行该操作的权限前端在每个请求的header中携带用户的token,后端根据token来验证用户的权限。如果用户没有权限执行该操作,则抛出相应的状态码,前端可以根据状态码出相应的操作。这种方案可以实现较为完整的权限控制。\[3\] 综上所述,前端可以通过前置路由守卫、按钮控制和后端验证来实现权限控制。具体的实现方式可以根据项目需求和技术栈来选择。 #### 引用[.reference_title] - *1* *3* [前端权限控制(一):前端权限管理及动态路由配置方案](https://blog.csdn.net/zhufan2333/article/details/126102001)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [前端权限控制](https://blog.csdn.net/ruantianqing/article/details/112999482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值