⑦ vue-router 用户权限控制
如何做才能限制要登录之后才能访问?
路由元信息
- 给路由存放信息
用户权限控制
用路由守卫--
next()
可以控制组件是否可以被访问
1. 定义路由元信息,确定哪个路由需要登陆权限
router > index.js
{
name: 'cart',
path: '/cart',
component: Cart,
meta: { requiresAuth: true }
}
2. 进入路由后,确认用户是否登录
- 全局路由守卫中做判断
如何实现登陆后跳回原页面?
- query & this.$router
-
登录则放行 -- [暂时]
-
否则跳转至登录界面并传递目标路由地址
app > routers > index.js -- 确认用户是否登录
router.beforeEach((to,from,next) => {
// 判断当前路由是否需要路由权限
if(to.meta.requiresAuth) {
//获取tokenlet
Authorization = localStorage.getItem('Authorization');
if(Authorization) {
//登录则放行
next();
} else {
//否则跳转到登录页面
//同时传递路由地址 -- 为了登录后能够再次返回
// router.push('/login');
next({
path: '/login',
query: {
redirectUrl: to.fullPath
}
});
}
} else {
next();
}
})
Login.vue -- 实现登录后跳回购物车 or我的
// 获取token并保存到本地
let Authorization = data.data;
localStorage.setItem('Authorization', Authorization);
//实现登录后跳回购物车or我的
console.log(this.$route.query);
let { redirectUrl } = this.$route.query || '/mine';
this.$router.replace(redirectUrl);
3. 校验 token 的有效性
-
是否过期
-
是否被篡改
token.js
function verify(token) {
let result;
try {
//解密
var decoded = jwt.verify(token, secretKey);
console.log('verify', decoded);
result = true;
} catch(err) {
// err
result = false;
}
return result;
}
database > routers > index.js
Router.get('/verify', (req,res) => {
//获取请求头上的token
let Authorization = req.get('Authorization');
if(token.verify(Authorization)) {
res.send(formatData())
} else {
res.send(formatData({status:0}))
}
});
app > routers > index.js -- 发送校验请求
router.beforeEach((to,from,next) => {
//判断当前路由是否需要路由权限
if(to.meta.requiresAuth) {
//获取token
let Authorization = localStorage.getItem('Authorization');
if(Authorization) {
//登录则放行
next();
//先放行,后期校验不通过再返回
//发送校验请求--校验接口
router.app.axios.get('http://localhost:1910/verify', {
headers: {
Authorization
}
}).then(({ data }) => {
console.log('校验结果:', data);
if(data.status == 0) {
//跳转到登录页面
next({
path: '/login',
query: {
redirectUrl: to.fullPath
}
});
}
})
} else {
//否则跳转到登录页面
//同时传递路由地址 -- 为了登录后能够再次返回
// router.push('/login');
next({
path: '/login',
query: {
redirectUrl : to.fullPath
}
});
}
} else {
next();
}
})
如何实现下次免登录?
- token 令牌
[在后端加密]
1. 第一次用户登录,后端校验通过则生成一个 token,并返回给客户端
-
借助第三方工具 ---
jsonwebtoken
-
token.js ---创建 token
const secretKey = 'zhoutest'; //密钥
/**加密--创建token
*
* @param {Object} data 加密的数据
* @param {Number|String} expirseIn 有效期
* @return {String} 返回token
*/
function create(data, expiresIn=20) {
let token = jwt.sign(
data,
secretKey, //密钥
{ expiresIn } //有效期(单位:s)
);
return token;
}
// login.js--将数据加密后生成的token,通过data传到客户端[前后端数据统一格式]
const { formatData, token } = require('../utils');
const colName='user';
Router.get('/', async (req, res)=>{
let { username, password } = req.query;
let data = await find(colName, { username, password })
if(data.length > 0) {
//登录成功创建一个令牌
let Authorization = token.create({username});
res.send( formatData({ data: Authorization }));
} else {
res.send(formatData({ status:0 }))
}
})
2. 客户端接收到 token,保存到本地
- Login.vue -- 保存
// 获取token并保存到本地
let Authorization = data.data;
localStorage.setItem('Authorization', Authorization);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)