【武林秘籍】—— 真实后台项目中接触到的权限管理

194 阅读6分钟

1.权限相关概念

1.1 权限的分类

后端权限

从根本上讲前端仅仅只是视图层的展示, 权限的核心是在于服务器中的数据变化,所以后端才是权限的关键,后端权限可以控制某个用户是否能够查询数据, 是否能够修改数据等操作。

后端如何知道该请求是哪个用户发过来的? cookie session token

后端的权限设计RBAC(基于角色的权限控制) 用户 角色 权限

前端权限

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

1.2 前端权限的意义

如果仅从能够修改服务器中数据库中的数据层面上讲, 确实只在后端做控制就足够了, 那为什么越来越多的项目也进行了前端权限的控制, 主要有这几方面的好处:

降低非法操作的可能性

  • 不怕赃偷就怕贼惦记, 在页面中展示出一个就算点击了也最终会失败的按钮,势必会增加有心者非法操作的可能性

尽可能排除不必要清求, 减轻服务器压力

  • 没必要的请求, 操作失败的清求, 不具备权限的清求, 应该压根就不需要发送, 请求少了, 自然也会减轻服务器的 压力

提高用户体验

  • 根据用户具备的权限为该用户展现自己权限范围内的内容, 避免在界面上给用户带来困扰, 让用户专注于分内之事

2.前端权限控制思路

2.1 菜单的控制

在登录请求中, 会得到权限数据, 当然, 这个需要后端返回数据的支持. 前端根据权限数据, 展示对应的菜单. 点击菜单, 才能查看相关的界面

2.2 界面的控制

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

2.3 按钮的控制

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

2.4 请求和响应的控制

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

三、Vue实现权限控制步骤

3.1 权限菜单栏控制

用户登录之后服务端返回一个数据,这个数据有菜单列表和token,我们把这个数据放入到vuex中,然后主页根据vuex中的数据进行菜单列表的渲染

问题: 刷新界面vuex数据消失,菜单栏消失

解决: 将数据存储在sessionStorage中,并让其和vuex中的数据保持同步

退出: 删除sessionStorage中的数据,让页面重新刷新(删除Vuex中的数据)

3.2 界面的控制

登录成功后,将token数据存储在sessionStorage中,判断是否登录

路由导航守卫

在这里插入图片描述

问题: 这样用户在登录之后就可以访问其他界面了,但如果用户A登录之后他只能访问a页面,他不能访问b页面,但是这时候他还是可以通过地址栏输入进入到b页面

解决: 当然我们也可以设置路由导航守卫,但是如果有多个页面,设置会非常不方便,并且对于用户A来说,它是不用访问b页面的,这时候我们何不对A不显示b页面,这个时候我们就用到了动态路由

动态路由

根据当前用户所拥有的的权限数据来动态添加所需要的路由

先定义好所有的路由规则 在这里插入图片描述

登录成功之后动态添加路由 注意这个initDynamicRoutes的方法需要暴露出去在登录页面调用 在这里插入图片描述

将有需要动态添加的路由抽取出来,并用路由名字:组件的形式形成一张映射表。

登录之后获取后端返回的路由权限并存入Vuex中,同时调用动态路由添加函数 根据用户所具备的权限,动态的添加路由:具体而言就是遍历后端返回的用户可访问的路由,再去我们之前定义好的映射表中进行匹配,如果匹配成功,就添加进行当前路由实例对象中,最后在调用addRoutes方法进行路由添加。

问题: 如果我们刷新页面,那么route.js会重新执行,因为此时并没有进行登录操作,当然也就没有调用动态路由添加函数,那么需要动态加载的路由就不会显示在页面中。

解决: 可以在app.vue中的created中调用添加动态路由的方法

3.3 按钮的控制

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

一般而言,后端返回的路由菜单中会针对不同用户设置不同的操作权限,比如普通用户只有查看的权限,这反应在其中一个字段中:比如rights: ["view"],我们可以根据这个权限对按钮进行显示隐藏。

具体实现:通过Vue自定义指令Vue.directive(自定义指令所在的dom元素,自定义指令的属性值), 1.在前面的动态路由的添加过程中,路由被添加时同时将对于页面按钮的可操作权限放入路由的元信息中。 2.将自定义指令所在的按钮设置的权限信息与路由可操作的权限进行进行匹配,如果匹配成功,则显示按钮,否则删除按钮或者禁用按钮。 在这里插入图片描述 添加自定义指令控制在这里插入图片描述按钮

3.4 请求和相应的控制

请求控制

除了登录请求都得要带上token , 这样服务器才可以鉴别你的身份

这块使用的就是asiox的请求拦截器设置 在这里插入图片描述

如果发出了非权限内的请求, 应该直接在前端范围内阻止, 虽然这个请求发到服务器也会被拒绝

非权限内的请求:比如a用户是不能够操作该页面的按钮的,但是他通过f12调试把按钮改为可点击,如果我们不对这个请求进行处理,那么这个请求就会发送出去。

在这里插入图片描述

响应控制

得到了服务器返回的状态码401, 代表token 超时或者被篡改了,此时应该强制跳转到登录界面 在这里插入图片描述