快速理解并实现权限控制

news2024/11/27 16:45:00

什么是权限控制?

权限控制是指在一个系统或应用中对用户或角色的操作进行限制和管理的过程。它用于确保只有经过授权的用户或角色能够执行特定的操作或访问特定的资源。权限控制是信息安全和访问控制的重要组成部分。

权限控制的主要目的是保护系统的安全性和完整性,防止未经授权的用户获取敏感信息、执行非法操作或对系统进行恶意操作。通过权限控制,可以限制用户或角色的访问权限和操作权限,确保系统只能被授权的用户或角色使用,提高系统的安全性。

权限控制通常涉及以下几个方面:

  1. 认证(Authentication):确认用户或角色的身份,验证其合法性和准确性。

  2. 授权(Authorization):根据用户或角色的身份和权限级别,授予相应的访问权限和操作权限。

  3. 权限管理(Permission Management):管理系统中的权限信息,包括创建、修改、删除和分配权限等操作。

  4. 角色管理(Role Management):定义和管理不同角色的权限,将用户划分为不同的角色,简化权限分配和管理过程。

  5. 访问控制(Access Control):对系统资源进行控制,限制用户或角色的访问范围和操作权限,确保系统的安全性。

权限控制是一种管理和限制用户或角色操作的机制,用于确保系统的安全性和完整性,防止未经授权的访问和操作。它是建立安全和可信系统的重要手段。

RBAC权限设计思想

RBAC(Role-Based Access Control)是基于角色的访问控制模型,是一种广泛应用于信息安全领域的访问控制机制。在 RBAC 模型中,访问权限被分配给了不同的角色,而用户则被分配到不同的角色上,从而实现了对用户访问资源的控制。

在 RBAC 模型中,用户可以拥有多个角色,每个角色可以访问一组权限,而权限又可以包含多个操作。通过将用户和角色进行分离,RBAC 可以极大地简化系统的管理和维护,同时也可以提高系统的安全性和可扩展性。

 

在实际应用中,RBAC 通常包括以下几个要素: 

  1. 用户:需要访问某些资源的具体用户。

  2. 角色:表示一组相关的权限集合,例如管理员、普通用户等。

  3. 权限:表示能够访问或执行某些操作的权利。

  4. 对象:表示需要被保护的资源,例如文件、数据库、网络连接等。

  5. 命令:表示用户执行的命令或者请求,需要经过鉴权来确定是否有权限执行。

一种基于角色的设计思想

  1. 给员工配置角色  (一个员工可以拥有多个角色)
  2. 给角色配置权限点 (一个角色可以有多个权限点)

页面级别

首先要修改 src/router/index.js 中的路由表,将路由表进行拆分,拆分成必须要显示的静态路由表和可以动态显示的动态路由表。

export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true,
    meta: {
      title: '登录'
    }
  },
 
  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true
  },
 
  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [{
      path: 'dashboard',
      name: 'Dashboard',
      component: () => import('@/views/dashboard/index'),
      meta: { title: '首页', icon: 'dashboard' }
    }]
  }
]
export const asyncRouters = [
  departmentRouter,
  roleRouter,
  employeeRouter,
 ...其他路由
]

然后我们获取Vuex中的数据。这个数据是在路由守卫中捕获到的用户登录时的信息,包含了用户的权限路径,这个获取的数据是与后端沟通好与路由名字一致这样方便我们实现权限控制。

router.beforeEach(async(to, from, next) => {
  // to and from are Route Object,next() must be called to resolve the hook}
  NProgress.start()
  const token = store.state.user.token
  if (token) {
    if (to.path === '/login') {
      next('/')
      NProgress.done()
    } else {
      if (!store.getters.userId) {
        // 获取权限信息
        const res = await store.dispatch('user/getUserInfo')
        console.log('当前用户一共可以访问', res.roles.menus, asyncRouters)
        // 在所有路由列表里过滤掉非当前用户权限
        const filteredRoutes = asyncRouters.filter(item => {
          return res.roles.menus.includes(item.children[0].name)
        })
        console.log('filteredRoutes', filteredRoutes)
        // 把404加到最后一条
        filteredRoutes.push({ path: '*', redirect: '/404', hidden: true })
        // 根据权限信息动态添加路由
        // 只有在这里设置了补充了路由配置,才可能去访问页面
        // 它们不会出现左侧
        router.addRoutes(filteredRoutes)
        // 将权限列表储存到vuex中
        store.commit('menu/setMenus', filteredRoutes)
        // 解决刷新出现的白屏bug
        next(to)//是保证路由添加完了再进入页面
      } else {
        next()
      }
      // console.log(1)
    }
  } else {
    if (wilteList.includes(to.path)) {
      console.log('没有token')
      next()
    } else {
      next('/login')
    }
  }
})

bug 

(1)如果我们刷新浏览器,会发现跳到了404页面

(2)对于addRoute添加的路由,在刷新时会白屏

原因

刷新浏览器,会发现跳到了404页面

现在我们的路由设置中的404页处在中间位置而不是所有路由的末尾了。

解决

把404页改到路由配置的最末尾就可以了

退出登录时重置路由

// 重置路由
export function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // 重新设置路由的可匹配路径
}

这个方法定义在 src/router/index.js 中,当你在退出的时候调用一下这个方法就可以解决了。

 

 在根据权限信息动态添加路由,并将权限列表储存到vuex中

import { constantRoutes } from '@/router/index'
export const state = {
  // 存储的是不需要权限也能访问的页面
  menuList: [...constantRoutes]
}
export const mutations = {
  updateMenu(state, menu) {
    // 将筛选出来的页面通过展开运算符加到 menuList 中
    state.menuList = [...constantRoutes, ...menu]
  }
}
export default {
  namespaced: true,
  state,
  mutations
}

按钮级别权限控制

目标

员工A和员工B都可以访问同一个页面(以员工管理为例),但是员工A可以导出excel,员工B就不可以导出excel(看不到按钮)

思路

用户登陆成功后,用户可以访问的按钮级别权限保存在points数组中。而这个数据我们是保存在vuex中的,所以,就可以在项目的任意地方来中访问。

     如果某个按钮上的标识在points出现,则可以显示出来

怎么实现呢?

就是给在需要进行权限控制的按钮设置 v-if="从vuex中获取到的points进行筛选判断"

这个方法太繁琐了,因为需要配置权限的按钮比较多,所以不方便,这里采用的是封装一个自定义指令 v-allow 来实现,只需调用这个方法里面传一个标识即可。

import store from '@/store'
 
export default {
  install(Vue) {
    // 封装按钮权限自定义指令
    Vue.directive('allow', {
      inserted: (el, binding) => {
        const res = store.state.user.userInfo.roles.points
        // console.log(el, binding, res)
    //如果找不到,那证明没有权限,把当前元素节点移除掉
        if (!res.includes(binding.value)) el.remove()
      }
    })
  }
}

 全局注册

import direction from '@/directive'

Vue.use(direction)

这样就可以实现按钮级别的权限控制,用户的权限不同,使用的功能不同。

以上就是权限控制的所有内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GEE:支持向量机(SVM)分类参数说明和官方案例

作者:CSDN @ _养乐多_ 本文记录了在GEE平台上进行支持向量机(SVM)分类使用ee.Classifier.libsvm的说明和官方案例。 文章目录 一、函数介绍1.1 GEE上说明1.2 函数说明二、官方案例一、函数介绍 1.1 GEE上说明 ee.Classifier.libsvm(decisionProcedure, svmType, kernelTyp…

CentOS5678 repo源 地址 阿里云开源镜像站

CentOS5678 repo 地址 阿里云开源镜像站 https://mirrors.aliyun.com/repo/ CentOS-5.repo https://mirrors.aliyun.com/repo/Centos-5.repo [base] nameCentOS-$releasever - Base - mirrors.aliyun.com failovermethodpriority baseurlhttp://mirrors.aliyun.com/centos/$r…

Springboot JPA 集成多租户

背景: ​ iot-kit项目用的是jpa,不是mybatis,项目中需要引入多租户 参考文章: 【讲解多租户的实现与原理】 https://www.bilibili.com/video/BV1F84y1T7yf/?share_sourcecopy_web&vd_source981718c4abc87423399e43793a5d3…

pytest实现用例间参数传递的方式

pytest实现用例间参数传递的方式 一、通过conftest创建全局变量二、使用tmpdir_factory方法 我们在做接口自动化测试的时候,会经常遇到这种场景:接口A的返回结果中的某个字段,是接口B的某个字段的入参。如果是使用postman,那我们可…

前端精度丢失处理

前端操作数据时,如果数据超出一定范围会出现精度丢失的问题,这是因为,在传输过程中,数据类型被转换成Number,Number的精度范围在2^53之间,即 -9007199254740991 ~ 9007199254740991,超出范围就会…

Unity游戏源码分享-迷你高尔夫球游戏MiniGolfConstructionKitv1.1

Unity游戏源码分享-迷你高尔夫球游戏MiniGolfConstructionKitv1.1 有多个游戏关卡 工程地址:https://download.csdn.net/download/Highning0007/88052881

Unity游戏源码分享-射酒瓶游戏Demo

Unity游戏源码分享-射酒瓶游戏Demo 工程地址:https://download.csdn.net/download/Highning0007/88052883

财务报表制作:哪些软件值得推荐?

当今,企业需要准确、及时地制作各种会计报表,以便管理者更好地掌握财务状况。然而,使用传统的纸质方式进行制表常常会出现复杂、繁琐等问题,降低制表效率。因此,使用会 计软件成为了制表的首选。 传统制作财务报表的方…

前端理解的HTTP缓存(缓存的过程/策略/控制机制/作用和应用)

目录 一、HTTP缓存有什么作用? 二、 浏览器的缓存策略有哪些? 1、强缓存(Expires、Cache-control) 2、协商缓存(Last-Modified、ETag) 3、缓存过程是什么? 三、浏览器缓存控制机制有哪些&…

八股文(消息队列)

文章目录 1. RabbitMQ特点2. 如何保证消息的可靠性3. RabbitMQ消息的顺序性4. 实现RabbitMQ的高可用性5. 如何解决消息队列的延时以及过期失效问题?6. RabbitMQ死信队列7. RabbitMQ延迟队列8.RabbitMQ的工作模式9. RabbitMQ消息如何传输10. 核心概念10.1 生产者和消…

MATLAB 常用函数小结

文章目录 【 生成 】随机数零或一其他 【 提取 】【 统计 】【 算法 】【 文件 】 【 生成 】 随机数 rand() rand(a,b) 生成区间 (0,1) 内均匀分布的随机数字组成的 axb 列矩阵。 均值0.5,方差1/120.08333。k*rand(a,b) 生成区间 (0,k) 内服从均匀分布的随机数字组…

华为OD机试真题 Java 实现【分割数组的最大差值】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

layui实现选项卡(万字博客!!!)

今日金句 努力不一定会被看到,但成功会 文章目录 前言一、什么是Tab选项卡二、Tab分类2.1 默认风格2.2 动态Tab2.3 Hash Tab2.4 简洁Tab2.5 卡片Tab2.6 响应式Tab2.7 带删除的Tab2.8 Js代码 三、实例3.1 引入html代码3.2 编写Js代码3.3 优化1:对应名称、…

javascript编写奇迹mu原版(含服务端)(7) 地图界面

其实主要的功能还是聊天,打怪我打算弄成自动的。可以传送到地图怪密集的地方打怪,然后获得经验和道具,也可发广告收消息。地图上那些是石头等不可移动的区域。怪和人都还没标上去,暂时想的是在地图上标一个红色的点。

人工智能自然语言处理:N-gram和TF-IDF模型详解

人工智能自然语言处理:N-gram和TF-IDF模型详解 1.N-gram 模型 N-Gram 是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为 N 的滑动窗口操作,形成了长度是 N 的字节片段序列。 每一个字节片段称为 gram,对所…

第一阶段-第九章 Python的异常、模块与包

目录 一、了解异常  1.学习目标  2.什么是异常  3.bug单词的诞生  4.本节的演示  5.本小节的总结 二、异常的捕获方法  1.学习目标  2.为什么要捕获异常  3.如何进行异常的捕获(异常为常规的、指定的、多个时,捕获所有异常、异常else、f…

跟我一起从零开始学python(八)全栈开发

前言 回顾之前讲了python语法编程 ,必修入门基础和网络编程,多线程/多进程/协程等方面的内容,后续讲到了数据库编程篇MySQL,Redis,MongoDB篇,和机器学习前面没看的也不用往前翻,系列文已经整理…

【ArcGIS Pro微课1000例】0028:绘制酒店分布热力图(POI数据)

本文讲解在ArcGIS Pro中文版中,基于长沙市酒店宾馆分布矢量点数据(POI数据)绘制酒店分布热力图。 文章目录 一、加载酒店分布数据二、绘制热度图参考阅读: 【GeoDa实用技巧100例】004:绘制长沙市宾馆热度图 【ArcGIS微课1000例】0070:制作宾馆酒店分布热度热力图 一、加载…

【java爬虫】将优惠券数据存入数据库排序查询

本文是在之前两篇文章的基础上进行写作的 (1条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客 (1条消息) 【java爬虫】使用selenium获取某宝联盟淘口令_haohulala的博客-CSDN博客 前两篇文章介绍了如何获取优惠券的基础信息,本文将获取到的…

mybatis-plus中的逻辑删除

官网:逻辑删除 | MyBatis-Plus 1.数据库字段 得有一个字段用来表示是否被删除。 记得加上注解TableLogic 也可以加上值,表示被删除具体得值,和没有被删除具体的值。 TableLogic(value "1",delval "0") 源码&#…