前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >单页应用优化--权限

单页应用优化--权限

作者头像
奋飛
发布于 2019-08-15 08:45:40
发布于 2019-08-15 08:45:40
1.4K00
代码可运行
举报
文章被收录于专栏:Super 前端Super 前端
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://ligang.blog.csdn.net/article/details/82686892

前段时间,撰写过“ 单页应用优化–懒加载”的问题,这篇我们描述一下单页应用的另外一个问题权限。提起权限,一般会涉及如下几种情况:

  • 应用使用权【登录】
  • 页面级别权限【菜单访问权限】
  • 模块级别权限【区域<组件、按钮>是否显示】
  • 数据级别权限【数据权限】

前端的权限控制实质上就是用于展示,让操作变得更加友好,真正的安全实际上是由后端控制的!

下述所有示例,都使用Vue编写,会重点描述页面级别权限模块级别权限

应用使用权限

这里的使用权限是指用户登录,其实就是简单的判断登录状态而已。通常我们会使用Session进行控制,前端请求携带Cookie(Cookie中保存sessionID),服务端依此进行用户身份识别。然而,使用Session进行管理用户登录状态,在当下后台无状态化盛行的情况下,以及多台节点部署Session同步或者横向扩展(Scale-out,把 session 实现基于中心化的 Redis 服务)等问题(有成熟的解决方法,这里不赘述),已不是最佳方案。

前端后分离的项目中,往往采用Restful风格进行前后端约束,我们通常会在请求头中携带Authorization/Token来解决用户身份识别。

上述流程参考自:https://www.cnblogs.com/qianduantuanzhang/archive/2018/01/05/8204692.html

思路:

第一步:点击登录按钮,触发Vuex中的登录事件,成功返回Token,存储Token到sessionStorage/localStorage中(前后端可以约定相应的编码机制);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 登录成功
store.commit(types.LOGIN)
/*
 * 1. vuex中存储用户和token信息
 * 2. 同步信息到localStorage中
 * 3. 调整到相关页面
 */

第二步:拦截处理

  • 【请求后台API】Axios Request钩子中,添加Authorization头,服务端获取进行校验;如果存在伪造情况,返回401,前端在Axios Response钩子中,进行捕获处理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // Axios Request钩子
 axios.interceptors.request.use(req => {
     req.headers.Authorization = store.state.token
     return req;
 }, error => {
     return Promise.reject(error);
 }// Axios Response钩子
 axios.interceptors.response.use(res => {
    return res;
 }, error => {
    switch(error.response.status) {
        case 401:
            // 触发退出操作 并跳转到登录页面
            store.commit(types.LOGOUT)
            router.replace({path: '/login'})
    }                           
    return Promise.reject(error);
 })                         
  • 【页面跳转】路由beforeEach钩子进行token信息校验(这里只能校验是否存在,具体准确性无法校验)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 router.beforeEach((to, from, next) => {
     // 注销 或者 没有用户信息
     if(to.path === '/login' || store.state.[info]) {
         store.commit(types.LOGOUT)
         next({path: '/login'})
     } else {
         next()
     }
 })

页面级别权限

需要router.addRoutes动态挂载路由。vue2.2.0以后新增了router.addRoutes,可动态挂载路由,无需在实例化之前就挂载上去的!

  • 创建vue实例的时候将vue-router挂载,但这个时候vue-router挂载一些登录或者不用权限的公用的页面;
  • 当用户登录后,获取用户权限列表,生成最终用户可访问的路由表;
  • 调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由;
  • 使用vuex管理路由表,根据vuex中可访问的路由渲染header、侧边栏组件。

参考地址:https://juejin.im/post/591aa14f570c35006961acac

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 登录成功,触发
this.updateRouter(data.routes)

// ...
methods: {
  // routes是后台返回来的路由信息 routes里应包含404情况
  async updateRouter (routes) {
    // routers默认
    const routers = [{
        path: '/login',
        name: 'login',
        component: login
    },  {
        path: '/',
        component: App,
        redirect: 'index',
        children: []
    }]
    routes.forEach(r => {
      routers[1].children.push({
        name: r.name,
        path: r.path,
        component: () => routesMap[r.component]
      })
    })
    this.$router.addRoutes(routers)
    this.$router.push('/')
  }
}

这样就实现了根据后端的返回动态扩展路由,当然也可以根据后端的返回生成侧栏或顶栏的导航菜单,这样就不需要再在前端处理页面权限了。需要注意的是,上面有待处理问题:

  • 登录成功后默认跳转到’/’,并非后台指定

注意事项:这里有一个需要非常注意的地方就是 404 页面一定要最后加载,如果放在routers一同声明了404,后面的所以页面都会被拦截到404,详细的问题见addRoutes when you’ve got a wildcard route for 404s does not work

对于后台返回的routes的说明: 方式一:后台完整返回整个路由,这里后台需要返回component的加载信息,然后前端直接addRoutes指定路由下(无权限的路由不会挂载,但后台需要指定component地址,前端强制依赖后台); 方式二:后台返回相关路由权限标识,前端将完整路由进行标识展示(所有路由会被挂载

我们采用二者结合方式,使用后台路由标识name(这里需要保证name的唯一性),然后前端根据后台返回的标识对路由进行剔除,动态添加路由。

模块级别权限

某些按钮是否可以点击;某些区域是否可以查看~

组件形式

这里使用render函数,它比template更接近编译器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Auth.vue
<script>
  export default {
    name: 'Auth-Comp',
    functional: true,
    // 增加了context来弥补缺少的实例
    render: function(createElement, context) {
        let {props, children, data} = context
        if(props.auth) {
          // return children  
          // 完全透明的传入任何特性、事件监听器、子节点等。
          return createElement('div', data, children)
        } else {
          return null
        }
    }
  }
</script>

// 使用
<Auth-Comp :auth="true"><Hello></Hello></Auth-Comp>

缺点,多添加了一层div,因为不允许存在多个根节点;注意,这里不能使用context.slots().default,因为如果存在具名slots会展示不全

指令形式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vue.directive('auth', {
  inserted(el, binding, vnode) {
    let {value} = binding
    if(value && !hasPermission(value)) {
        el.parentNode && el.parentNode.removeChild(el)
    }
  }
})

// 使用
<Hello v-auth="true"></Hello>

一个指令定义对象可以提供几个钩子(均可选):

  • bind:指令第一次绑定到元素时调用,只调用一次
  • inserted:被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中);
  • update:所有组件VNode更新时调用,可能发生在其子VNode更新前,可以比较更新前后的值来忽略不必要的模板更新;
  • componentUpdate:指令所在组件的VNode**及其子VNode**全部更新后调用;
  • unbind:只调用一次,指令与元素解绑时调用。

缺点,不能在<template>标签上使用!

数据级别权限

这通常需要服务端根据用户权限对数据进行控制,来确保是否返回给前端,前端根据返回结果进行展示~~~

补充

公司采用的权限标识为8421,即

delete

put

post

get

8

4

2

1

关于权限规则,也可以采用Apache Shiro的规则。printer:query:lp7200 第一部分是域,第二部分是操作,第三部分是正在执行的实例。

参考地址:http://shiro.apache.org/permissions.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年09月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue 实现动态路由及登录&404页面跳转控制&页面刷新空白解决方案
import NotFound from "@/views/Error/404";
授客
2020/02/18
3.1K0
关于门户的前端权限管理
通过递归的方式去过滤去用户的路由权限,通过router.addRoutes()动态添加所有符合权限的路由,当然这种方式需要依赖后端。对于不同角色的用户,是由后端将路由列表告诉给前端注册
徐小夕
2021/06/08
1.6K0
关于门户的前端权限管理
Vue Router 实现动态路由和常见问题解决方案
个人理解:动态路由不同于常见的静态路由,可以根据不同的「因素」而改变站点路由列表。常见的动态路由大都是用来实现:多用户权限系统不同用户展示不同导航菜单。
Ryoma
2022/04/02
3.4K0
vue cli3 搭建一个通用中台(二)
前文 上一文中已经完成了项目的创建和环境的配置 本文将完成以下几点 用户登录页面 mock数据模拟请求 动态路由构建 开始 先安装我们需要的依赖 npm i element-ui axios mockjs vuex-persistedstate vue-particles -S 介绍 mockjs --> 用来模拟请求 element-ui --> 本项目中使用的ui库 axios --> ajax请求 vuex-persistedstate --> vuex状态持久化插件 vu
yangdongnan
2019/05/07
9730
vue cli3 搭建一个通用中台(二)
浅析 vue-router 源码和动态路由权限分配
? 这是第 72 篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队 关注我们吧~ 本文首发于政采云前端团队博客:浅析 vue-router 源码和动态路由权限分配 https://ww
政采云前端团队
2020/10/26
4.6K0
浅析 vue-router 源码和动态路由权限分配
vuejs单页应用的权限管理实践
在众多的B端应用中,简单如小型企业的管理后台,还是大型的CMS,CRM系统,权限管理都是一个重中之重的需求,过往的web应用大多采取服务端模板+服务端路由的模式,权限管理自然也由服务端进行控制和过滤.但是在前后端分离的大潮下,如果采用单页应用开发模式的话,前端也无可避免要配合服务端共同进行权限管理,接下来会以vuejs开发单页应用为例,给出一些尝试方案,希望也能给大家提供一些思路.注意采用nodejs作为中间层的前后端分离不在此文讨论范围.
funkyLover
2019/01/31
2.3K0
vuejs单页应用的权限管理实践
6 种 Vue 权限路由实现方式总结(最全)
已经登录 (已经取得后台返回的用户的权限信息(角色之类的)),则判断当前要跳转的路由,用户是否有权限访问 (根据路由名称到全部路由里找到对应的路由,判断用户是否具备路由上标注的权限信息 (比如上面的roles : [ 'admin', 'editor' ]))。
夜尽天明
2019/06/20
5.7K0
面试官:Vue要做权限管理该怎么做?控制到按钮级别的权限怎么做?
接口权限目前一般采用jwt的形式来验证,没有通过的话一般返回401,跳转到登录页面重新进行登录
@超人
2021/02/26
19.5K0
面试官:Vue要做权限管理该怎么做?控制到按钮级别的权限怎么做?
初识ABP vNext(4):vue用户登录&菜单权限
几乎所有的系统都绕不开登录功能,那么就从登录开始,完成用户登录以及用户菜单权限控制。
xhznl
2020/08/20
2.2K0
初识ABP vNext(4):vue用户登录&菜单权限
Vue权限路由思考
登录成功后同时要做很多事情,具体业务具体对待。后台管理系统 登录成功后会请求当前用户的菜单权限接口,来获取用户的可访问的路由(动态路由),获取成功后,Vue Router 是不能直接使用的,必须得解析成符合Vue Router 可识别的格式 . ❞
山月
2021/04/07
3820
Vue权限路由思考
vue项目管理_vue适合做管理系统吗
后台页面的权限验证与安全性是非常重要的,可以说是一个后台项目一开始就必须考虑和搭建的基础核心功能 我们前端所要做的是: 不同的权限对应着不同的路由,同时侧边栏也需要根据不同的权限 , 异步生成.
全栈程序员站长
2022/10/03
1.6K0
熬夜整理的vue面试题,面试加油
接口权限目前一般采用jwt的形式来验证,没有通过的话一般返回401,跳转到登录页面重新进行登录
bb_xiaxia1998
2022/09/23
2K0
三年经验前端vue面试记录
vue-router中两个重要组件router-link和router-view,分别起到导航作用和内容渲染作用,但是回答如何生效还真有一定难度
bb_xiaxia1998
2022/10/31
2.2K0
权限管理模块中动态加载Vue组件
当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异。笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方案,希望这个系列能够给小伙伴一些帮助。本系列文章并不是手把手的教程,主要介绍了核心思路并讲解了核心代码,完整的代码小伙伴们可以在GitHub上star并clone下来研究。另外,原本计划把项目跑起来放到网上供小伙伴们查看,但是之前买服务器为了省钱,内存只有512M,两个应用跑不起来(已经有一个V部落开源项目在运行
江南一点雨
2018/04/02
1.9K0
基于vue(element ui) + ssm + shiro 的权限框架
现在的Java世界,各种资源很丰富,不得不说,从分布式,服务化,orm,再到前端控制,权限等等玲琅满目,网上有句话说,语言框架迭代太快了,我学不动了,不如回去搬砖吧,可是天这么热,砖烫手啊。程序搞起来很容易,就是有点头冷。
用户1306381
2018/08/15
2.3K0
基于vue(element ui) + ssm + shiro 的权限框架
浅谈有关前端角色权限方案
在前端中如何实现不同角色与权限的控制及落地,从而控制不同的用户能够访问不同的页面呢?今天FInClip的工程师就跟我们好好聊一下有关前端角色权限方案。
金牌打杂仔
2021/12/28
1K0
vue后台管理之动态加载路由
我们的通用的后台管理系统中,我们会根据权限的粗细不同,会对每个角色每个权限每个资源进行控制。同样的我们也需要实现一个这样的功能。 这篇文章我将主要讲vue端的实现,关于后台接口我就不会涉及,当我接触的时候我们的后台接口是springcloud实现。
yukong
2018/08/08
4.9K1
vue后台管理之动态加载路由
vue实现动态权限与菜单
相信很多的前端工作者都遇到过路由动态权限的需求,有些小伙伴一时之间也不知道该如何下手
前端小tips
2021/11/30
2.3K0
vue实现动态权限与菜单
对权限管理的一些理解
后台系统几乎都会涉及权限管理,实现的方式有蛮多的,只是前端只能做样子货,最终的权限管理还是得后台做。今天说说自己认知的权限管理的几个方式。
wade
2020/09/04
7400
学习 Vue 3 全家桶 - 权限设计
登录成功后,需要把这个 token 存储在本地存储里面,留着后续发送数据。实现比较简单,直接把 token 存储到 localStorage 中就行。
Cellinlab
2023/05/17
3580
学习 Vue 3 全家桶 - 权限设计
推荐阅读
相关推荐
Vue 实现动态路由及登录&404页面跳转控制&页面刷新空白解决方案
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文