vue 通过动态路由实现权限控制
权限控制
对于权限控制之类的问题,如果采用的是传统的动态页面技术(jsp,.net)进行开发的时候,我们完全可以在后端完成权限的控制,但是如果是使用的SPA技术开发出的前端页面的话,可能会有一些问题,因为前端的路由都是写死的,理论上来说,我们将所有的前端页面都加载到了客户端,我们可以在前端的js当中处理页面授权问题,但是因为路由已经完全暴露,可能会有一些风险。
vue-router通过动态路由实现权限控制
进入到用户业务界面,通过向后台进行ajax请求获取到用户的权限信息,这里通过json文件进行用户菜单的模拟,json文件如下:
[
{
"groupName": "basic demo",
"icon": "ios-navigate",
"order": "1",
"children": [
{
"path": "/moredetail",
"jsUrl": "views/seeddemo/Detail",
"order": "moredetail",
"name": "moredetail"
},
{
"path": "/moredetail1",
"jsUrl": "views/seeddemo/ListDemo",
"order": "moredetail1",
"name": "moredetail1"
},
{
"path": "/formdemo",
"jsUrl": "views/seeddemo/FormDemo",
"order": "formdemo",
"name": "formdemo"
}
]
},
{
"groupName": "item2",
"icon": "ios-keypad",
"order": "2",
"children": [
{
"path": "/moredetail3",
"jsUrl": "views/seeddemo/Detail",
"order": "moredetail3",
"name": "moredetail3"
},
{
"path": "/moredetail4",
"jsUrl": "views/seeddemo/Detail",
"order": "moredetail4",
"name": "moredetail4"
}
]
},
{
"groupName": "item3",
"icon": "ios-analytics",
"order": "3",
"children": [
{
"path": "/moredetail5",
"jsUrl": "views/seeddemo/Detail",
"order": "moredetail5",
"name": "moredetail5"
}
]
}
]
用户从登陆页到业务操作页面时,在页面加载完成后通过用户的登录信息获取其对应的菜单:
mounted: function() {
var me = this;
// 判断缓存中是否有用户数据
this.$axios_get('seedjson/menulist.json').then(function(data){
console.dir(data);
me.menuList = data.data;
// 将路由数据添加到缓存当中
jscookie.set("routes", data.data);
/**
* @author jcxu
* @description 用户在从登陆页面跳转到此页面时 从服务端获取相应的菜单信息,并动态的加载,需要注意的是,如果用户进行了全局刷新,那么久需要从服务端重新获取相应的菜单信息
*/
me.$router.addRoutes([{
path: '/layout1',
name: 'layout1',
component: function(resolve) {
return require(["TemplateLayout"], resolve);
},
children: SeedUtils.changeMenuToRouter(data.data)
}])
})
}
使用动态路由会遇到这样的问题,用户在刷新浏览器的时候会丢失动态加载的路由,这就需要我们在路由信息加载完成的时候将路由信息缓存到客户端,当用户刷新的时候,先检查客户端是否存在路由信息,如果存在则加载客户端的路由信息:
beforeCreate: function () {
var me = this;
//看看cookie中是否有值,有的话就动态添加路由
//console.dir(jscookie.get("routes"));
var routes = jscookie.get("routes");
// TODO 还需要判断用户是不是处于登录的状态
if (routes) {
me.$router.addRoutes([{
path: '/layout1',
name: 'layout1',
component: function (resolve) {
return require(["TemplateLayout"], resolve);
},
children: SeedUtils.changeMenuToRouter(eval(routes))
}])
}
},
以上大致可以实现通过动态路由进行权限控制,还存在一些刷新时的细节要调整下。
最后更新于