1.用户权限控制

1.1 用户登录

1.1.1 流程分析

1) 用户登录界面,需要输入手机号密码

2) 登录组件 login.vue

  • 登录按钮

type="primary" :loading="loading" @click="submit('login-form')">{{ loading ? 'Loading...' : '登录' }}

  • 提交表的方法

//提交登录表单
 submit(ref) {
      //校验
      this.$refs[ref].validate(valid => {
        if (!valid) return false;
 
        this.error = null;
        this.loading = true;
 
        //发送登录请求
        this.$store.dispatch("createToken", this.model)
          .then(res => {
            if (res.state !== 1) {
              this.error = {
                title: "Error occurred",
                message: "Abnormal, please try again later!"
              };
            }
            this.$router.replace({ path: this.$route.query.redirect ||"/" });
            this.loading = false;
          })
          .catch(err => {
            this.loading = false;
          });
      });
    }
  }

  • this.$store.dispatch("createToken", this.model)

    • 这段代码的意思是调用 store仓库的actions.js中的createToken方法

  • 发送登录请求,进行登录的代码

/**
   * 创建新的客户端令牌
   */
  createToken: async ({ commit }, { username, password }) => {
    //请求后台登录接口
    const res = await TokenService.userLogin({
      phone: username.trim(),
      password: password.trim()
    });
 
    console.log(res);
 
    //判断结果不等于1,登录失败
    if (res.state !== 1) {
      return Promise.resolve(res);
    }
 
    //获取到content
    const result = res.content;
 
    //将token保存
    commit(CHANGE_SESSION, {
      accessToken: result.access_token
    });
     
    return res;
  },

  • TokenService

import { TokenService, UserService } from "../services";

//登录请求 async ES6语法, 作用: 发送异步请求
export const userLogin =  async (data) => {
 //await 表示等待接收返回的数据
 return await PostRequest(`${process.env.VUE_APP_API_FAKE}/user/login${Serialize(data)}`)
}

1.2 动态获取用户菜单

1.2.1 流程分析

1) 在我们登录成功后, 会立即发送第二个请求, 来获取用户的菜单权限列表

2) 在actions.js 中完成请求后台接口 获取数据的操作

/**
   * 获取当前登录用户权限
   */
  getUserPermissions: async ({ commit }) => {
    //1.请求后台 获取当前用户的权限
    const res = await UserService.getUserPermissions();
 
    //2.判断
    if (!res.success) {
      //获取失败直接返回 false
      return res.success;
    }
 
    //3.获取数据成功,取出菜单 与 资源列表
    const { menuList, resourceList } = res.content;
 
    //4.下面的代码 就是在生成树形结构的菜单
    let menus = [];
    const formatMenu = treeData => {
      if (treeData.length > 0) {
        return treeData.map(item => formatMenu(item));
      }
      const result = {};
 
      //shown等于表示可以显示,将内容保存
      if (treeData.shown == 1) {
        result.id = treeData.id;
        result.text = treeData.name;
        result.label = treeData.name;
        result.name = treeData.href;
        result.icon = treeData.icon;
        result.shown = treeData.shown;
      } else {
        return "";
      }
 
      //获取子节点
      if (treeData.subMenuList) {
        result.children = [];
        treeData.subMenuList.forEach(item => {
          formatMenu(item) && result.children.push(formatMenu(item));
        });
 
        if (result.children.length === 0) {
          delete result.children;
        }
      }
      return result;
    };
 
    const memusMap = {};
 
    const splapMenu = treeData => {
      if (treeData.length > 0) {
        return treeData.map(item => splapMenu(item));
      }
      const result = {};
      result.id = treeData.id;
      result.text = treeData.name;
      result.label = treeData.name;
      result.name = treeData.href;
      result.icon = treeData.icon;
      result.shown = treeData.shown;
      result.name && (memusMap[result.name] = result);
 
      if (treeData.subMenuList) {
        result.children = [];
        treeData.subMenuList.forEach(item => {
          result.children.push(splapMenu(item));
        });
      }
      return result;
    };
 
    splapMenu(menuList);
 
    menus = formatMenu(menuList);
    commit(CHANGE_SIDERBAR_MENU, menus);
    return { menus, resourceList, menuList, memusMap };
  },

1.3 验证Token

1.3.1 导航守卫

在执行路由之前先执行的一些钩子函数,比如验证用户是否有权限之类的操作,就需要使用.

1) authorize.js 中配置了导航守卫,来对用户的登录进行限制

// 导航守卫 to要访问的url, from从哪个路径跳转过来, next() 放行
  router.beforeHooks.unshift((to, from, next) => {
    //不需要验证直接放行
    if (!to.meta.requireAuth) return next();
 
    //需要验证token,调用 store中的checkToken方法
    store.dispatch("checkToken").then(valid => {
      //判断是否存在token
      if (valid) {
        //发送请求到后台,在后台再次判断token是否存在
        store.dispatch("getUserPermissions").then(res => {
       
          if (!res) {
            //失效 清除token
            store.dispatch("deleteToken");
 
            //跳转到登录页面
            return next({ name: "ToLogin" });
          }
 
          //token正确, 导航到对应的页面
          const { memusMap } = res;
          if (memusMap.Courses && to.name === "Home") {
            return next();
          } else if (memusMap[to.name]) {
            return next();
          } else if (Object.keys(memusMap).length > 0) {
            return next({ name: memusMap[Object.keys(memusMap)[0]].name });
          } else {
            next({ name: "PermissionDenied" });
          }
        });
        return next();
      }
      // unauthorized
      console.log("Unauthorized");
 
      //用户没有登录 跳转到登录页面
      next({ name: "Login", query: { redirect: to.fullPath } });
    });
  });

checkToken: async ({ commit, getters }) => {
    //取出token
    const token = getters.session.accessToken;
 
    if (!token) {
      //不可用
      return Promise.resolve(false);
    }
 
    return Promise.resolve(true);
  },

2) 在actions.js 中检查token是否可用

checkToken: async ({ commit, getters }) => {
    //取出token
    const token = getters.session.accessToken;
 
    if (!token) {
      //不可用
      return Promise.resolve(false);
    }
 
    return Promise.resolve(true);
  },

用户权限控制(Token登录)相关推荐

  1. mysql用户控制登录_MySql用户权限控制_MySQL

    bitsCN.com MySql用户权限控制 本文将介绍MySql创建帐号,删除帐号,设置和介绍各种帐号的权限 创建用户帐号: www.bitsCN.com [sql] CREATE USER use ...

  2. asp.net core根据用户权限控制页面元素的显示

    asp.net core根据用户权限控制页面元素的显示 Intro 在 web 应用中我们经常需要根据用户的不同允许用户访问不同的资源,显示不同的内容,之前做了一个 AccessControlHelp ...

  3. struts2如何使用拦截器进行用户权限控制

    大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对VIP开放等等,这些权限的控制都可以用struts2中的拦截器来实现. 下面通过一个简单的Demo ...

  4. Vue2.0用户权限控制解决方案

    Vue2.0用户权限控制解决方案 参考文章: (1)Vue2.0用户权限控制解决方案 (2)https://www.cnblogs.com/zhumengke/articles/11526973.ht ...

  5. Vue-Access-Control:前端用户权限控制解决方案

    Vue-Access-Control:前端用户权限控制解决方案 参考文章: (1)Vue-Access-Control:前端用户权限控制解决方案 (2)https://www.cnblogs.com/ ...

  6. 案例分享:Qt激光加工焊接设备信息化软件研发(西门子PLC,mysql数据库,用户权限控制,界面设计,参数定制,播放器,二维图,期限控制,参数调试等)

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127669684 长期持续项目技术分享,有专业Qt需求请 ...

  7. Java系列技术之SSH整合+用户权限控制模型项目-钟洪发-专题视频课程

    Java系列技术之SSH整合+用户权限控制模型项目-62人已学习 课程介绍         将前面讲过的Spring5.SpringMVC.Hibernate5和前端框架Easyui整合起来最终完成一 ...

  8. 基于RESTful API 怎么设计用户权限控制?

    作者:JC_Huang http://www.jianshu.com/p/db65cf48c111 1   前言 有人说,每个人都是平等的: 也有人说,人生来就是不平等的: 在人类社会中,并没有绝对的 ...

  9. 实现sessionfilter_session应用--采用filter和session实现简单用户权限控制

    前面有讲到一些session的基础知识点,这里那我们就将session和filter做结合,实现一个简单地应用处理用于一般后端管理程序的权限控制! ①我们先建立一个filter的实现类Security ...

最新文章

  1. 基于 OpenCV 的人脸追踪
  2. 机器学习热码one hot python
  3. 系统调优,你所不知道的TIME_WAIT和CLOSE_WAIT
  4. NFV — 高性能 NFVI
  5. 关于Transformer和BERT,在面试中有哪些细节问题?
  6. vue获取浏览器地址栏参数(?及/)路由+非路由实现方式
  7. oracle存储过程捕捉异常后回滚_Oracle存储过程中异常处理应注意的问题
  8. .net mysql字符串截取_MySQL 字符串拆分操作(含分隔符的字符串截取)
  9. 纪中游记 - Day 3
  10. 系统分析和设计方法之系统分析
  11. 数据结构刘畅c语言版课后答案,数据结构习题集答案--清华大学版
  12. Java小白 学习笔记(二)——2020版Java语言基础
  13. 【NOTE】python3.6下scons运行提示找不到SCons.Script解决方式
  14. 【读书笔记】Java并发编程的艺术
  15. Android ListView添加头部和尾部
  16. css绘制安卓机器人
  17. 详说TCP/IP协议
  18. 工作三年的前端开发20k简历标准
  19. 云主机的优势有哪些?
  20. 20175227张雪莹 2018-2019-2 《Java程序设计》第四周学习总结

热门文章

  1. 项目经理如何才能做好沟通?
  2. java 组织机构代码_JAVA实现社会统一信用代码较验
  3. 使用 Web3.js 进行 Matic 测试网上链操作
  4. 微机原理与接口技术 | 一、微型计算机系统
  5. 思想一年一年进步才好
  6. linux下的rtc机制
  7. 恒生电子实习记录-12
  8. 文件查重删除,继续完善及修改上篇内容
  9. 原生js自定义属性的操作:setAttribute、getAttribute、removeAttribute、hasAttribute
  10. 基于一维卷积Conv1D实现猫狗叫声语音识别