vue-element-admin登录 / 注销 / 权限验证 篇

裤衩大佬:不同的权限对应着不同的路由,同时侧边栏也需根据不同的权限,异步生成。

链接:https://juejin.im/post/591aa14f570c35006961acac

下述所有的数据和操作都是通过vuex全局管理控制的。补充说明:刷新页面后 vuex的内容也会丢失,所以需要重复上述的那些操作

登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到cookie中,保证刷新页面后能记住用户登录状态),前端会根据token再去拉取一个 user_info 的接口来获取用户的详细信息(如用户权限,用户名等等信息)。

路径:src/views/login/index.vue
https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/login/index.vue登录事件
<el-input @keyup.enter.native="handleLogin"/> <!-- 键修饰符,键别名  @keyup.enter-->
<el-button @click.native.prevent="handleLogin">Login</el-button> //.native - 监听组件根元素的原生事件。//触发登录操作
this.$store.dispatch('user/login', this.loginForm).then(() => {this.$router.push({ path: '/' }); //登录成功之后重定向到首页
}).catch(err => {this.$message.error(err); //登录失败提示错误
});// Vuex 操作
const actions = {// user loginlogin({ commit }, userInfo) {const { username, password } = userInforeturn new Promise((resolve, reject) => {// 请求接口 获取其用户对应的 tokenlogin({ username: username.trim(), password: password }).then(response => {const { data } = responsecommit('SET_TOKEN', data.token)setToken(data.token) // setToken() 方法是将token 存进cookies 中resolve()}).catch(error => {reject(error)})})},}

登录成功后,服务端会返回一个 token(该token的是一个能唯一标示用户身份的一个key),之后我们将token存储在本地cookie之中,这样下次打开页面或者刷新页面的时候能记住用户的登录状态,不用再去登录页面重新登录了。

获取用户信息

用户登录成功之后,我们会在全局钩子router.beforeEach中拦截路由,判断是否已获得token,在获得token之后我们就要去获取用户的基本信息了

//router.beforeEach
if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息store.dispatch('GetInfo').then(res => { // 拉取user_infoconst roles = res.data.role;next();//resolve 钩子})

还记得上面的 补充说明么? 刷新页面后 vuex的内容也会丢失,所以需要重复上述的那些操作

一旦用户 刷新页面之后 Vuex 中的数据会丢失,哪么 vue-element-admin 中是怎么处理的

  • 首先账号密码登录之后获取其token,并且存入Cookies 中
  • 当页面刷新之后,token从Cookies 中重新获取,然后重新拉取 user_info 信息,所以在 Vuex 中的actions 重新带上 token 去请求 , Vuex 中 actionsmutation 之间的区别自行百度
const getDefaultState = () => {return {token: Cookies.get(TokenKey),name: '',avatar: ''}
}const actions = {// get user infogetInfo({ commit, state }) {return new Promise((resolve, reject) => {getInfo(state.token).then(response => {const { data } = responseconsole.log('user_login_data') // 每次刷新页面之后 都会重新打印一次if (!data) {reject('Verification failed, please Login again.')}const { name, avatar } = datacommit('SET_NAME', name)commit('SET_AVATAR', avatar)resolve(data)}).catch(error => {reject(error)})})},
}

但是刷新页面之后 ,该项目中再次请求接口的状态码是 304,大家可以百度一下 304的含义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IGwNK7Ho-1587432218959)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420215906875.png)]

裤衩大佬:ps:为了保证安全性,我司现在后台所有token有效期(Expires/Max-Age)都是Session,就是当浏览器关闭了就丢失了。重新打开游览器都需要重新登录验证,后端也会在每周固定一个时间点重新刷新token,让后台用户全部重新登录一次,确保后台用户不会因为电脑遗失或者其它原因被人随意使用账号。

就如前面所说的,我只在本地存储了一个用户的token,并没有存储别的用户信息(如用户权限,用户名,用户头像等)。有些人会问为什么不把一些其它的用户信息也存一下?主要出于如下的考虑:

假设我把用户权限和用户名也存在了本地,但我这时候用另一台电脑登录修改了自己的用户名,之后再用这台存有之前用户信息的电脑登录,它默认会去读取本地 cookie 中的名字,并不会去拉去新的用户信息。

所以现在的策略是:页面会先从 cookie 中查看是否存有 token,没有,就走一遍上一部分的流程重新登录,如果有token,就会把这个 token 返给后端去拉取user_info,保证用户信息是最新的。 当然如果是做了单点登录得功能的话,用户信息存储在本地也是可以的。当你一台电脑登录时,另一台会被提下线,所以总会重新登录获取最新的内容。

而且从代码层面我建议还是把 loginget_user_info两件事分开比较好,在这个后端全面微服务的年代,后端同学也想写优雅的代码~

权限验证:通过token获取用户对应的 role,动态根据用户的 role 算出其对应有权限的路由,通过 router.addRoutes 动态挂载这些路由。

权限篇具体实现

1.创建vue实例的时候将vue-router挂载,但这个时候vue-router挂载一些登录或者不用权限的公用的页面。

2.当用户登录后,获取用role,将role和路由表每个页面的需要的权限作比较,生成最终用户可访问的路由表。

3.调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由。

4.使用vuex管理路由表,根据vuex中可访问的路由渲染侧边栏组件。

注意事项:这里有一个需要非常注意的地方就是 404 页面一定要最后加载,如果放在constantRouterMap一同声明了404,后面的所以页面都会被拦截到404

vue-element-admin 登录 / 注销 / 权限验证 篇相关推荐

  1. vue element admin登录方式切换(密码登录或短信登录)

    显示结果: 具体代码可以根据vue element admin源码进行更改,下面是页面代码 <el-form ref="loginForm" :model="log ...

  2. java springmvc权限校验_详解Spring MVC使用Filter实现登录及权限验证判断

    登录和权限验证判断在后台管理系统中是最常用的功能,这部分代码是比较固定和独立的,为了减少对业务代码入侵性,一般我会考虑使用Filter来实现,下面我就来详细说一下我的实现思路和代码: 前台页面: St ...

  3. Vue Element Admin 使用mock模块模拟数据

    Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路.通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发更加独立自主,不会被服务端的开发所阻塞. vue-elem ...

  4. vue+element+admin(初始化项目)

    2022.10.17我接触到了vue+element+admin的使用,首先要安装node.jshttps://nodejs.org/zh-cn/download/.和githttps://git-s ...

  5. 后端使用SpringBoot和Jwt工具与Redis数据库+前端Vue Element Admin实现用户携带token的登录功能案例

    登录功能描述: 前端输入对应的用户信息 ,在用户输入邮箱后 点击发送按钮给邮箱发送验证码,拿取到验证填完之后,点击登录按钮给后端发送请求 ,后端接收到请求之后 ,第一步校验验证码,第二步校验用户名和密 ...

  6. Vue实现用户登录及token验证

     写博客不是为了博眼球 而是为了记笔记 请勿复制全部代码防止错乱,这里放源码是为了个人做笔记 //登录     login: params => {         return API.POS ...

  7. Vue保持用户登录及权限控制

    vue-router-power-demo 核心内容有两点: 一是保持用户登录状态,二是根据登录用户的角色动态挂在路由 使用vuex保持用户登录 点击登录按钮,使用vuex的actions分发登录操作 ...

  8. jwt判断token是否过期_4spring-security5整合jwt做登录、权限验证,全网最全!!!可用...

    github源码: https://github.com/gyb123456/spring-security5-jwt,最烦那些写文档只截图一半还不给源码的人,要不你就截全图,要不就给源码! 前言: ...

  9. Vue Element Admin 添加侧边栏以及他的页面

    1. 在 /src/views/ 下添加需要的页面 2. 配置路由器 router 中的路由表 routes,分为 constantRoutes 和 asyncRoutes. 将路由的配置信息添加进路 ...

最新文章

  1. 从零开始写一个武侠冒险游戏-3-地图生成
  2. sqlplus登录方式,列出所有表,列出表结构,sqlplus行和列显示设置,别名,空值问题,连接符,DISTINCT
  3. Spring ribbon
  4. php划分年龄段,儿童时期是怎样划分年龄阶段的
  5. 怎么更改wifi频段_手机wifi延迟高怎么办
  6. 我对骨骼动画的理解(最精减的骨骼动画类)
  7. 初步接触Java中的Lambda表达式
  8. 用Python 开发您的第一个 XGBoost 模型(收藏)
  9. 百度地图点聚合,加载1万个marker
  10. 计算机毕业设计django基于python仓库管理系统(源码+系统+mysql数据库+Lw文档)
  11. latex添加标准文献:texmaker+bibtex+gbt7714-2005.bst
  12. Go Module 私有仓库:fatal: could not read Username for ‘https://xxx.com‘: terminal prompts disabled
  13. 湖南大学ACM程序设计新生杯大赛(同步赛)L-Liao Han【打表规律+二分】
  14. 超级牛人华为工作十年离职感想
  15. html九宫格拼图怎么做,朋友圈九宫格拼图照片制作方法
  16. 离散数学——coq学习笔记(二)
  17. 从0开始:win10系统下基于V831的目标检测
  18. Java-MQTT客户端监控连接状态事件
  19. python联网斗地主_Python斗地主
  20. oracle核销预付账款,AP模块外币预付款核销的CNY尾差问题

热门文章

  1. mac中nginx局域网不能访问,解决办法整理
  2. 中兴事件的启示——核心技术才是基业长青的基石
  3. 手把手教你使用Python网络爬虫获取王者荣耀英雄皮肤
  4. 王文学:远特会直通远程会议助力证券公司高效沟通
  5. Unifi(Ubnt)如何实现办公室网络搭建和VLAN划分
  6. 2022虎年全新头像框制作微信小程序源码下载
  7. Hexo 静态博客 我的新博客
  8. 本地仓库首次提交或拉取时报错-refusing to merge unrelated histories
  9. 《调皮包马小跳》读后感
  10. 教育直播平台有哪几种类型?怎么选择?