登录权限校验-四种方式

304 阅读5分钟

这四种权限,前提都是,用户一登陆,就把用户信息+Token记录下来,配合Vuex+presistedState缓存在store仓库里面

接口权限

在axios的响应拦截器里发现返回401/403返回码,一脚送他去登录页
  • 实现原理:需要服务端配合,【服务端】首先在用户登录成功的时候,就需要给他塞一个Token;在用户没登录/用户不是管理员的时候,塞一个返回码code=401 / code=403【服务端这里是通过中间键来判断】;
  • (大前提)用户一登陆,就把用户信息+Token记录下来,配合Vuex+presistedState缓存在store仓库里面,(任何请求都带着Token)进而在请求拦截器当中配置请求头headers["Authorization"] = Bearer ${store.state.token},(服务端根据Token进行校验)服务端根据携带的请求头进行校验,是否是管理员的Token,不是管理员会返回一个403返回码,响应拦截器进行判断,如果返回的返回码是401/403,直接一脚继续送他去登录页。【这里需要配合Vuex来配合,一得到Token以及用户信息存到store中央数据仓库当中,方便任意组件获取】

控制路由权限

@方案A

一开始就加载全部路由,通过全局守卫判断该路由所对应的meta信息是否属于管理员路由,根据缓存在store的用户信息判断,是管理员就跳转,则给他跳登录页
  • 这里需要用到全局路由守卫router.beforeEach(),【在跳转之前进行检查】满足条件next(),给你去想去的页面,则我来安排你该去哪

@方案B

一开始只加载公共路由,根据缓存在store的用户信息判断,是管理员就动态加载权限路由,则给他跳404,
  • 这里一开始就加载任何人都可以访问的路由,当访问需要权限的页面时,通过全局路由守卫router.beforeEach(),检查你是否是管理员,是管理员通过router.addRoute(r)添加权限路由表,进行跳转next(),则我也给你跳转next(),只不过公共路由没有权限路由信息,你将和404见面罢了
两者区别:
  • 一种加载全部路由,则需要在路由表里通过meta:{}配置一些信息,作为你需要权限才可以访问的路由标记,只要你满足条件,我就给你跳转,不然就去登录页
  • 而后者已经拆分好了,只要你满足条件,我就给你加载权限路由,不然就去404,为了路由不重复加载,加上一个判断条件router.hasRoute()看当前需加载路由,是否已经存在在公共路由表里;注意:这里指的满足条件是缓存在store里面的用户数据。进而进行判断;

控制菜单权限

这里就是根据不同身份的人,进行渲染不同的菜单(菜单数据可以从服务端获取/本地前端自己配置好进行渲染罢了
  • 当用户暴力输地址,怎么处理?(因为路由表里面已经配置好了,暴力输入,还是可以跳转的),需要通过控制路由权限(看用户的身份,管理员,我就加载管理员路由表,运营人员,我就加载运营人员路由表,不存在就是404,这样菜单+控制路由权限更加健壮)再配置一下
  • 重点就是菜单怎么根据数据进行渲染???
  • 答案就是:使用封装好的递归菜单组件,直接跟傻子式的把数据就得了
  • 递归菜单详解地址:url:xxx

控制按钮权限

  • 把没有权限的按钮隐藏
  • 简单点:使用v-if配合着store,满足条件就渲染这个元素/组件,反之不渲染罢了
  • 稍微高级点:使用自定义指令v-admin 满足条件就渲染,则把这个元素/组件remove()

退出登录逻辑 (登录都做了,不妨再做个登出吧!)

  • 我们登录成功是把数据放在localStorage下面,所以登出,就直接把缓存删掉,完事!
  • 用户要是没登录,但是触发这个事件逻辑,不好意思,送你去登录
/* 查询localStorage 通过window.localStorage.getItem(key) 这里是通过key找到对象的value,这时再拿自己想要的数据 */
let token = JSON.parse(window.localStorage.getItem("vuex")) && JSON.parse(window.localStorage.getItem("vuex")).token
  window.localStorage.clear()
  if (token) {
    ElMessage({
      message: "已退出登录",
      type: 'success',
    })
  } else {
    router.push("/login")
  }

四种权限区别:

  • 接口控制策略是服务端天然存在的(服务端配好的),前端是否做配套处置看具体业务需求;

  • 全路由表策略适用于比较小型的工程;

  • 路由表策略(先加载公共路由表,登录后再动态补充加载权限路由表),适用于中大型项目,前期只加载一部分路由表能提升一些性能;

  • 无论全路由策略还是半路由策略,由于全局守卫的存在,性能都好不到哪去;

  • 菜单策略一次性完成大面积的访问权限控制,作为一种宏观权限控制策略,个人认为要比路由控制更可取;

  • 按钮显隐策略适合打扫一些边边角角的地方,是一种有效且必要的补充机制;