• 前端高频面试题——有做过权限相关的事情吗?


           权限部分在RBAC的权限控制基础上,实现了员工管理,权限管理,角色绑定和权限绑定等功能,让管理员用户可以通过将权限分配给角色后,角色分配用户实现权限控制,并通过动态路由和全局指令实现路由和按钮的权限控制。


    下面具体说说:

    一、什么是RBAC权限控制?

    答案 RBAC 的权限模型, RBAC(Role-Based Access control) ,也就是基于角色的权限分配解决方案,同角色有着相同的权限, 操作角色权限的同时 , 所有该角色的用户对应权限 , 就会同步更新。

    二、说说菜单权限怎么做的?

       大概分成下面几个步骤

    1. 1项目通过几个业务模块的配合生成对应的权限数据
    1. async getUserInfo(ctx) {
    2. // 调用获取用户信息的接口
    3. const res = await getUserInfo()
    4. // 获取用户头像
    5. const info = await getUserDetailById(res.userId)
    6. ctx.commit('setUserInfo', { ...res, ...info })
    7. // 将个人权限数据返回
    8. return res.roles
    9. }
    1. 2把后端返回的权限数据和前端本地的路由做对比,得到过滤之后的有资格显示的路由数组
    1. import { asyncRoutes } from '@/router'
    2. if (!store.getters.userId) {
    3. // 拿到菜单权限数据
    4. const roles = await store.dispatch('user/getUserInfo')
    5. // 做过滤处理
    6. // 如果路由的name属性能在menus权限数据中找到代表可以访问
    7. let filterRoutes = []
    8. filterRoutes = asyncRoutes.filter(route => {
    9. return roles.menus.includes(item.children[0].name)
    10. })
    11. console.log('根据权限过滤后的路由表为:',filterRoutes)
    12. }
    1. 3调用路由核心方法router.addRoutes把路由数组加入到路由系统中
    1. if (!store.getters.userId) {
    2. // 拿到菜单权限数据
    3. const roles = await store.dispatch('user/getUserInfo')
    4. // 这里做权限控制
    5. // 做过滤处理
    6. // 如果路由的name属性能在menus权限数据中找到代表可以访问
    7. let filterRoutes = []
    8. filterRoutes = asyncRoutes.filter(route => {
    9. return roles.menus.includes(item.children[0].name)
    10. })
    11. // 把动态路由添加到应用的路由系统里
    12. router.addRoutes(filterRoutes)
    13. }
    1. 4如果需要显示到左侧菜单里,可以配合vuex做,vuex存一份相同的数据,渲染左侧的菜单
    1. 1. 定义vuex管理菜单数据
    2. // 导入静态路由
    3. import { constantRoutes } from '@/router'
    4. export default {
    5. namespaced: true,
    6. state: {
    7. // 先以静态路由表作为菜单数据的初始值
    8. menuList: [...constantRoutes]
    9. },
    10. mutations: {
    11. setMenuList(state, asyncRoutes) {
    12. // 将动态路由和静态路由组合起来
    13. state.menuList = [...constantRoutes, ...asyncRoutes]
    14. }
    15. }
    16. }
    1. 2. 提交setMenuList生成完整的菜单数据
    2. if (!store.getters.userId) {
    3. await store.dispatch('user/getUserInfo')
    4. // 把动态路由添加到应用的路由系统里
    5. router.addRoutes(asyncRoutes)
    6. // 把动态路由数据交给菜单
    7. store.commit('routeMenu/setMenuList', asyncRoutes)
    8. }
    1. 3. 菜单生成部分改写使用vuex中的数据
    2. routes() {
    3. // 拿到的是一个完整的包含了静态路由和动态路由的数据结构
    4. // return this.$router.options.routes
    5. return this.$store.state.routeMenu.menuList
    6. }

    三、 按钮的权限又怎么做呢?

    按钮的权限其实就是控制显示隐藏

    思路就是通过后端返回的权限标识和按钮自身的标识code做对比,如果有资格就显示,否则就隐藏。这里根据思路我们可以封装一个全局指令,通过指令可以实现复用,就可以在需要控制的按钮身上进行指令绑定,从而控制按钮的显示也隐藏。

    1. //定义全局指令
    2. import Vue from 'vue'
    3. import store from '@/store'
    4. Vue.directive('checkBtn', {
    5. inserted(el, binding) {
    6. const { value } = binding
    7. const hasPermission = store.state.user.userInfo.roles.points.includes(value)
    8. if (!hasPermission) {
    9. el.parentNode.removeChild(el)
    10. // el.remove()
    11. }
    12. }
    13. })
    1. //使用全局指令
    2. <el-button v-checkBtn="'CKGZ'">查看工资el-button>
    3. <el-button v-checkBtn="'XGGZ'">修改工资el-button>
  • 相关阅读:
    【数组】-找出有序数组中(有负有正)绝对值最小的数
    python学习笔记4-二分查找
    Java递归生成树形菜单结构的json
    [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径
    计算机毕业设计Python+Django的银行取号管理系统
    pytest运行时参数说明,pytest详解,pytest.ini详解
    HTML5期末大作业:游戏网站设计与实现——基于bootstrap响应式游戏资讯网站制作HTML+CSS+JavaScript
    【Linux系统编程:基础IO 壹】简单复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux下,一切皆文件 | 重定向原理
    使用HHDBCS管理Redis
    Linux下交叉编译工具链的安转和配置总结
  • 原文地址:https://blog.csdn.net/m0_67841039/article/details/126375909