权限控制权限控制权限控制权限控制权限控制

1.权限的分类

视频学习:https://www.bilibili.com/video/BV15Q4y1K79c/?spm_id_from=333.337.search-card.all.click&vd_source=386b4f5aae076490e1ad9b863a467f37

1.1 后端权限

1. 后端如何知道该请求是哪个用户发过来的

可以根据 cookiesessiontoken,一般是根据token获取的

2. 后端的权限设计RBAC

权限一般是分配给角色角色下有很多用户,这样用户就有对应的权限
一个用户可以有多个角色,一个角色下有很多用户

1.2 前端权限

1.必要性

前端权限的控制本质上来说, 就是控制端的视图层的展示和前端所发送的请求。但是只有前端权限控制没有后端权限控制是万万不可的。 前端权限控制只可以说是达到锦上添花的效果。

2.好处

为什么越来越多的项目也进行了前端权限的控制, 主要有这几方面的好处:

  1. 降低非法操作的可能性,无权限的按钮可能会带来有心者非法操作
  2. 尽可能排除不必要清求, 减轻服务器压力
  3. 提高用户体验,避免在界面上给用户带来困扰, 让用户专注于分内之事

2.前端权限控制思路

2.1 菜单的控制

根据后端返回的数据. 前端展示对应的菜单. 点击菜单, 才能查看相关的界面

2.2 界面的控制

如果用户没有登录, 手动在地址栏敲入管理界面的地址, 则需要跳转到登录界面
如果用户已经登录, 如果手动敲入非权限内的地址, 则需要跳转404 界面

2.3 按钮的控制

在某个菜单的界面中, 还得根据权限数据, 展示出可进行操作的按钮,比如删除, 修改, 增加

2.4 请求和响应的控制

如果用户通过非常规操作, 比如通过浏览器调试工具将某些禁用的按钮变成启用状态, 此时发的请求, 也应该被前端所拦截

3.实现步骤

3.1 权限菜单栏控制

3.1.1 登录按钮

  1. 点击登录按钮 ,获取token和侧边栏数据,将侧边栏数据存入vuex中
  2. 在home组件中获取侧边栏数据,渲染到侧边栏

出现的问题:刷新浏览器,vuex的数据会被清空
解决:与sessionStorage结合使用

store文件下的index.js

import Vue from 'vue
import Vuex from 'vuex
Vue .use(Vuex)export default new Vuex.store({state:{rightlist:JsoN.parse(sessionstorage.getItem('rightList')||'[]')},mutations:{setRightList(state, data){state.rightList = datasessionStorage.setItem('rightList',JSON.stringify(data))},...

login.vue的代码:

login(){this.$refs.loginFormRef.validate(async valid =>{...this.$store.commit('setRightList', res.rights)this.$message.success('登录成功')this.$router .push('/home')})}

home.vue的代码:

import{mapstate }from 'vuex'
computed:{...mapstate(['rightList'])
}
created(){this.activePath =window.sessionstorage.getItem('activePath')this.menulist = this.rightList
}

3.1.2 登出按钮

期望:退出后,清空sessionStorage缓存和vuex的数据

logout(){// 删除sessionstorage中的数据sessionStorage.clear()this.$router.push("/login')// 删除vuex中的数据,让当前的界面刷新window.location.reload()
}

3.2 界面的控制

3.2.1 登录成功之后才能跳转到管理平台界面。

但是如果用户直接敲入管理平台的地址,也是可以跳过登录的步骤,所以应该在某个时机判断用户是否登录
1)如何判断是否登录
缓存中是否有token

sessionStorage.setItem('token', res.data.token)

2)什么时候判断
路由导航守卫

router.beforeEach((to,from,next)=>{if(to.path ==='/login'){next()} else {const token =sessionstorage.getItem('token')if(!token){next('/login')} else {next()}}
})

3.2.2 具备菜单权限才能跳转到访问页面

虽然菜单项已经被控制住了,但是路由信息还是完整的存在于浏览器,正比如zhangsan这个用户并不具备角色这个菜单,但是他如果自己在地址栏中敲入/roles的地址,依然也可以访问角色界面
路由导航守卫固然可以在每次路由地址发生变化的时候,从vuex中取出rightlist判断用户将要访问的界面,这个用户到底有没有权限。不过从另外一个角度来说,这个用户不具备权限的路由,是否也应该压根就不存在呢?
router.js

import Vue from "vue
import Router from 'yue-router
import Login from '@/components/Login.vue'
import Home from'@/components/Home.vue'
import welcome from '@/components/welcome.vue'
import Users from'@/components/user/Users.vue'
import Roles from'@/components/role/Roles.vue'
import GoodsCate from '@/components/goods/GoodsCate.vue'
importGoodsList from '@/components/goods/GoodsList.vue'
import NotFound from '@/components/NotFound.vue'
import store from '@/store1mport'Vue.use(Router)const userRule={path:/users',component:Users }
const roleRule ={path:'/roles', component: Roles }
const goodsRule={path:'/goods', component: GoodsList }
const categoryRule ={ path:"/categories', component: Goodscate }const ruleMapping ={
'users': userRule,
'roles': roleRule,
'goods': goodsRule,
'categories': categoryRule
}const router = new Router({routes:[{path:'/'redirect:'/home',},{path:'/1ogin',component: Login,},{path:'/home',component:Home,redirect:"/welcomechildren:[{ path:'/welcome',component:welcome },//{path:'/users',component:Users },// { path: '/roles',component:Roles },//{ path:'/goods',component:GoodsList },//{path:"/categories',component: GoodsCate }}},{path:'*',component: NotFound}
]
}]router.beforeEach((to,from,next)=>{if(to.path ==='/login'){next()} else {const token =sessionstorage.getItem('token')if(!token){next('/login')} else {next()}}
})export function initDynamicRoutes(){//根据二级权限,对路由规则进行动态的添加const currentRoutes =router.options.routesconst rightList =store.state.rightListrightList.forEach(item =>{item.children.forEach(item =>{//item 二级权限const temp = ruleMapping[item.path]//设置路由元信息temp.meta = item.rights//添加动态路由currentRoutes[2].children.push(temp)})})router .addRoutes(currentRoutes)
}export default router		

Login.vue

import {initDynamicRoutes } from '@/router.js'login(){this.Srefs.loginFormRef.validate(async valid =>{if(!valid)returnconst { data:res }= await this.$http.post('login', this.loginForm)if(res.meta.status !== 200) return this.$message.error('登录失败!')this.$store.commit('setRightList',res.rights)				this.$store.commit('setusername',res.data.username)sessionStorage.setItem('token',res.data.token)initDynamicRoutes()this.$message.success('登录成功')this.Srouter .push('/home')})
}

问题: 如果我们重新刷新的话动态路由就会消失,动态路由是在登录成功之后才会调用的,刷新的时候并没有调用,所以动态路由没有添加上
解决: 可以在app.vue中的created中调用添加动态路由的方法

`App.vue````javascript
import { initDynamicRoutes }from '@/router.js'
export default {name: 'app'created(){initDynamicRoutes()}
}

3.3 按钮的控制

虽然用户可以看到某些界面了,但是这个界面的一些按钮,该用户可能是没有权限的.因此,我们需要对组件中的一些按钮进行控制,用户不具备权限的按钮就隐藏或者禁用,而在这块中,可以把该逻辑放到自定义指令

  • permission.js
    自定义指令——显示还是隐藏按钮
import Vue from 'vue
import router from '@/router.js'
Vue.directive('permission', {inserted: function(el, binding){const action = binding.value.action//获取当前路由的metaconst currentRight =router.currentRoute.metaif(currentRight){if(currentRight.indexof(action)==-1){// 不具备权限const type = binding.value.effect//禁用按钮if(type ==='disabled'){el.disabled = trueel.classList.add('is-disabled')else {//不显示按钮el.parentNode.removechild(el)}}}
  • main.is
    引入自定义指令
import'./utils/permission.js'
  • router.js
    router中通过meta获取按钮权限
export function initDynamicRoutes(){const currentRoutes =router.options.routesconst rightList =store.state.rightListrightList.forEach(item =>{item.children.forEach(item =>{//下面是核心的两行,router中加入metaconst itemRule =ruleMapping[item.path]itemRule.meta=item.rightscurrentRoutes[2].children.push(itemRule)})
})
router.addRoutes(currentRoutes)
  • 使用指令
v-permission="{action:'add'}"
v-permission="{action:'delete', effect:'disabled'}"

3.4 请求和响应的控制

3.4.1 请求控制

  • 除了登录请求都得要带上token,这样服务器才可以鉴别你的身份
axios.interceptors.request.use(function(reg){const currentUrl =reg.ur1if(currenturl !== 'login'){req.headers.Authorization =sessionstorage.getItem('token')}return reg
})
  • 如果发出了非权限内的请求,应该直接在前端范围内组织,虽然这个请求发到服务器也会被拒绝
import axios from'axios'
import Vue from 'vue'
import router from '../router'
//配置请求的跟路径,目前用mock模拟数据,所以暂时把这一项注释起来
// axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/'
const actionMapping={get:'view',post:'add',put: 'edit',delete:'delete'
}axios.interceptors.request.use(function(req){const currentUrl=req.urlif(currenturl !== 'login'){req.headers.Authorization =sessionStorage.getItem('token')// 当前模块中具备的杈限// 查看 get请求// 增加post请求// 修改put请求// 删除delete请求const method =reg.method// 根据请求,得到是哪种操作const actión= actionMapping[method]// 判断action是否存在当前路由的权限中const rights =router.currentRoute.metaif(rights && rights.indexof(action)==-1){// 没有权限alert("没有权限")return Promise.reject(new Error('没有权限'))}}return reg
})axios.interceptors.response.use(function(res){return res
})
Vue.prototype.$http =axios

3.4.2 响应控制

  • 得到了服务器返回的状态码401,代表token超时或者被篡改了,此时应该强制跳转到登录界面
axios.interceptors.response.use(function(res){if(res.data.meta.status === 401){router.push('/login')sessionstorage.clear()window.location.reload()}return res
})

4. 小结

前端权限的实现之须要后端提供数据支持, 否则无法实现。
返回的权限数据的结构, 前后端需要沟通协商怎样的数据便用起来才最方便

4.1 菜单控制

  • 权限的数据需要在多组件之间共享, 因此采用vuex
  • 防止刷新界面, 权限数据丢失, 所以需要存在sessionStorage, 并目要保证两者的同步

4.2 界面控制

  • 路由的导航守卫可以防止跳过登录界面
  • 动态路由可以让不具备权限的界面的路由规则压根就不存在

4.3 按钮控制

  • 路由规则中可以增加路由元数据meta
  • 通过路由对象可以得到当前的路由规则以及存在此规则中的meta 数据
  • 自定义指令可以很方便的实现按钮控制

4.4 请求和响应控制

  • 请求拦截器和响应拦截器的使用
  • 请求方式的约定restful
    在这里插入图片描述

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

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

相关文章

WIN32核心编程 - 进程操作(一) 进程基础 - 创建进程 - 进程句柄

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 进程基础 进程的定义与概念 进程的组成 创建进程 可执行文件 CreateProces 执行流程 GetStartupInfo 进程终止 进程句柄 创建进程 打开进程 进程提权 内核模拟 回溯对象 自身进…

SD NAND时序解析

一、SD NAND时序的重要性 在SD NAND的数据传输过程中,时序起着至关重要的作用。正确的时序确保了数据能够准确无误地在主机和SD NAND之间传输。 二、命令与读写时序 SD NAND的通信基于命令和数据传输,遵循以下时序规则: 命令与响应交互&…

安卓常用的控件

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 在Android开发中,控件(也称为视图或控件组件)是构建用户界面的基本元素。它们…

康姿百德磁性床垫好不好,效果怎么样靠谱吗

康姿百德典雅款床垫,打造舒适睡眠新体验 康姿百德床垫是打造舒适睡眠新体验的首选,其设计能够保护脊椎健康,舒展脊椎,让您享受一夜好眠。康姿百德床垫的面料选择也非常重要,其细腻亲肤的针织面料给您带来柔软舒适的触…

如何在操作使用ufw设置防火墙

UFW(简单防火墙)是用于管理iptables防火墙规则的用户友好型前端。它的主要目标是使iptables的管理更容易。 在学习Linux的时候大家一般都会关心命令,Posix API和桌面等,很少会去了解防护墙。其实除了一些网络安全厂商提供的付费防…

交互案例:5大经典交互效果

文件格式:.rp(请与班主任联系获取原型文档) 文件名称:Axure交互案例:5大经典交互实现 文件大小:78.5 MB 文档内容介绍 五大经典交互包括: 图片手风琴 图片悬浮放大 详细说明切换 图片全屏查…

上位机GUI 第三弹

😊 😊 😊 从协议层面讲,地质单元相当重要,调试模式,我只能义命令发送的索引码作为,每个设备的区分方式,调试的情况,不在设备上设置任何东西,开机访问地址和端口就能用 因为懒,直接将…

【代码随想录】【算法训练营】【第55天】 [42]接雨水 [84]柱状图中最大的矩形

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 55,又是一个周一,不能再坚持~ 题目详情 [42] 接雨水 题目描述 42 接雨水 解题思路 前提:雨水形成的情况是凹的, 需要前中后3个元素,计算该元…

专业的TPM管理咨询公司有哪些特点?

专业的TPM管理咨询公司,作为现代企业管理和设备维护的重要合作伙伴,其特点不仅体现在技术能力和服务质量上,更在于其独特的经营理念和方法论。以下是专业TPM管理咨询公司所具备的显著特点: 一、全面的技术实力与深厚的行业经验 专…

word 转pdf 中图片不被压缩的方法

word 转pdf 中图片不被压缩的方法 法1: 调节word 选项中的图片格式为不压缩、高保真 法2: 1: word 中的图片尽可能使用高的分辨率,图片存为pnd或者 tif 格式(最高清) 2: 转化为pdf使用打印机器,参数如下…

分子AI预测赛笔记

#AI夏令营 #Datawhale #夏令营 Taks1 跑通baseline 根据task1跑通baseline 注册账号 直接注册或登录百度账号,etc fork 项目 零基础入门 Ai 数据挖掘竞赛-速通 Baseline - 飞桨AI Studio星河社区 启动项目 选择运行环境,并点击确定,没…

台灯学生用哪个牌子最好?学生用台灯品牌排行榜分析

台灯学生用哪个牌子最好?护眼台灯在近年来成为家长和长时间使用电子设备人群关注的家电/学生产品。对于家中有孩子或经常面对电子屏幕的人士来说,很多人可能已经对这类产品有所了解并进行了购买。然而,部分家长对护眼台灯的认识还不够深入&am…

FFT 简单基础(matlab

使用 fs 进行采样,进行 N点FFT 选择显示0~N/21点的幅值 横坐标对应频率计算公式: fs * n / N 举个梨子: 频率2kHz采样1s,得到2000个点的序列y(n) 对序列y(n)做4096点的FFT 幅值响应对应的横坐标频率…

机器人控制系列教程之Stewart平台简介和运动学分析

Stewart平台简介及应用场景 六自由度 Stewart 并联机器人结构简图如下图所示,主要有一个固定平台和一个移动平台以及六个可伸缩的推杆组成,通常情况下,固定平台与底座连接,移动平台在空间具有六个自由度,通过六个推杆…

价格很实惠,希喂、爱立方、生生不息主食冻干抗得住实测吗?

在挑选主食冻干时,许多宠物主人都会感到头疼。尽管主食冻干相较于普通猫粮具有诸多优势,但其价格也相对高昂。这导致许多宠物主人担心高价购买的主食冻干可能营养价值并不理想。然而,在选择时,我们还需要考虑其他重要因素&#xf…

Spring MVC 中 使用 RESTFul 实现用户管理系统

1. Spring MVC 中 使用 RESTFul 实现用户管理系统 文章目录 1. Spring MVC 中 使用 RESTFul 实现用户管理系统2. 静态页面准备2.1 user.css2.2 user_index.html2.3 user_list.html2.4 user_add.html2.5 user_edit.html 3. SpringMVC环境搭建3.1 创建module:usermgt3…

tapd 与国内外主流的8大项目管理软件大对比

对比Tapd与8大项目管理工具:PingCode、Worktile、Redmine、Teambition、广联达、Jira、禅道、飞书。 Tapd 是腾讯推出的一款敏捷开发管理工具,特别适合那些需要高效协作和快速迭代的敏捷开发团队。它支持多种敏捷方法论,包括Scrum和Kanban&am…

数学建模------Matlab数据可视化

目录 1.plot函数 (1)函数介绍 (2)参数介绍 (3)图形美化 (4)背景更改 (5)多组绘制 (6)图形叠加 (7)添加…

Elasticsearch备份数据到本地,并导入到新的服务 es 服务中

文章目录 使用elasticsearch-dump工具备份安装node.js(二进制安装)解压设置环境变量安装elasticsearch-dump docker安装使用ES备份文件到本地 使用elasticsearch-dump工具备份 这个工具备份时间比较长 安装node.js(二进制安装) wget https://nodejs.org/dist/v16.18.0/node-…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 英文单词联想(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 https://app5938.acapp.acwing.com.cn/contest/2/problem/OD…