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;
},
|
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登录)相关推荐
- mysql用户控制登录_MySql用户权限控制_MySQL
bitsCN.com MySql用户权限控制 本文将介绍MySql创建帐号,删除帐号,设置和介绍各种帐号的权限 创建用户帐号: www.bitsCN.com [sql] CREATE USER use ...
- asp.net core根据用户权限控制页面元素的显示
asp.net core根据用户权限控制页面元素的显示 Intro 在 web 应用中我们经常需要根据用户的不同允许用户访问不同的资源,显示不同的内容,之前做了一个 AccessControlHelp ...
- struts2如何使用拦截器进行用户权限控制
大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对VIP开放等等,这些权限的控制都可以用struts2中的拦截器来实现. 下面通过一个简单的Demo ...
- Vue2.0用户权限控制解决方案
Vue2.0用户权限控制解决方案 参考文章: (1)Vue2.0用户权限控制解决方案 (2)https://www.cnblogs.com/zhumengke/articles/11526973.ht ...
- Vue-Access-Control:前端用户权限控制解决方案
Vue-Access-Control:前端用户权限控制解决方案 参考文章: (1)Vue-Access-Control:前端用户权限控制解决方案 (2)https://www.cnblogs.com/ ...
- 案例分享:Qt激光加工焊接设备信息化软件研发(西门子PLC,mysql数据库,用户权限控制,界面设计,参数定制,播放器,二维图,期限控制,参数调试等)
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127669684 长期持续项目技术分享,有专业Qt需求请 ...
- Java系列技术之SSH整合+用户权限控制模型项目-钟洪发-专题视频课程
Java系列技术之SSH整合+用户权限控制模型项目-62人已学习 课程介绍 将前面讲过的Spring5.SpringMVC.Hibernate5和前端框架Easyui整合起来最终完成一 ...
- 基于RESTful API 怎么设计用户权限控制?
作者:JC_Huang http://www.jianshu.com/p/db65cf48c111 1 前言 有人说,每个人都是平等的: 也有人说,人生来就是不平等的: 在人类社会中,并没有绝对的 ...
- 实现sessionfilter_session应用--采用filter和session实现简单用户权限控制
前面有讲到一些session的基础知识点,这里那我们就将session和filter做结合,实现一个简单地应用处理用于一般后端管理程序的权限控制! ①我们先建立一个filter的实现类Security ...
最新文章
- 基于 OpenCV 的人脸追踪
- 机器学习热码one hot python
- 系统调优,你所不知道的TIME_WAIT和CLOSE_WAIT
- NFV — 高性能 NFVI
- 关于Transformer和BERT,在面试中有哪些细节问题?
- vue获取浏览器地址栏参数(?及/)路由+非路由实现方式
- oracle存储过程捕捉异常后回滚_Oracle存储过程中异常处理应注意的问题
- .net mysql字符串截取_MySQL 字符串拆分操作(含分隔符的字符串截取)
- 纪中游记 - Day 3
- 系统分析和设计方法之系统分析
- 数据结构刘畅c语言版课后答案,数据结构习题集答案--清华大学版
- Java小白 学习笔记(二)——2020版Java语言基础
- 【NOTE】python3.6下scons运行提示找不到SCons.Script解决方式
- 【读书笔记】Java并发编程的艺术
- Android ListView添加头部和尾部
- css绘制安卓机器人
- 详说TCP/IP协议
- 工作三年的前端开发20k简历标准
- 云主机的优势有哪些?
- 20175227张雪莹 2018-2019-2 《Java程序设计》第四周学习总结
热门文章
- 项目经理如何才能做好沟通?
- java 组织机构代码_JAVA实现社会统一信用代码较验
- 使用 Web3.js 进行 Matic 测试网上链操作
- 微机原理与接口技术 | 一、微型计算机系统
- 思想一年一年进步才好
- linux下的rtc机制
- 恒生电子实习记录-12
- 文件查重删除,继续完善及修改上篇内容
- 原生js自定义属性的操作:setAttribute、getAttribute、removeAttribute、hasAttribute
- 基于一维卷积Conv1D实现猫狗叫声语音识别