vue----vue-router
权限管理
方式1:
本地放一份完整的菜单数据,通过后台返回角色的菜单列表.两者对比,筛选需要显示的菜单数据绑定,
这里有个问题就是路由vue实例初始化就生成了,加载的全部,人为输入地址是可以访问到角色权限以外的数据,
所以还要加路由构子router.beforeEach()去做判断哪些是角色权限以内的路由.
由于我们菜单栏是通过roles自动生成的,所以我们第一步,根据不同的用户返回不同的菜单(不能解决用户直接输入网址访问)
1、给router设置属性,比如在mete中添加一个roles
{
path: "/",
name: "dashboard",
hidden: true,
component: Layout,
redirect: "/home", //父路由没有在mete中设置roles,表示任何人都可以访问
children: [
{
path: "/home",
name: "home",
meta: {title: '首页', icon: 'fa fa-home',roles:["admin","xx"]}, //子路由设置了roles,表示只有admin和xx可以访问
component: () => import("@/views/Home.vue")
}
]
},
2、当用户登录的时候,保存user的时候,我们遍历routes中的每一个route,判断该路由时候被过滤掉(在actions.js中设置)
import {routes} from "@/router";
import {ActionTree} from 'vuex';
import jwt_decode from 'jwt-decode';
const actions: ActionTree<any, any> = {
async setUser({state, commit}, user: any) {
var jwtDecode:any = jwt_decode(user);
//设置user信息
commit('SET_USER', jwtDecode);
//----------------设置用户访问路由的权限---------------------
//获取jwtDecode中的user_roles,user信息中需要有user_roles(后台返回的)
const { user_roles } = jwtDecode;
//过滤路由(routes:当前的所有的路由)
let accessedRouters = filterAsyncRouter(routes,user_roles);
commit('SET_ROUTERS', accessedRouters);
}
}
/**
* 递归对routers进行过滤,返回routers
* route:当前路由对象
*/
function filterAsyncRouter(asyncRouterMap: Array<any>,roles:any) {
const accessedRouters = asyncRouterMap.filter(route => {
if (hasPermission(roles,route)) {
if (route.children && route.children.length) {
route.children = filterAsyncRouter(route.children,roles);
}
return true;
}
return false;
});
return accessedRouters;
}
/**
* 判断是否有权限
* @param roles 当前角色
* @param route 当前路由对象
* */
function hasPermission(roles: any, route: any) {
if (route.meta && route.meta.roles) {
//roles是自己设置的一个数组
return route.meta.roles.some((role: string) => role.indexOf(roles) >= 0)
}else {
//如果当前路由对象routes.meta没有roles属性,表示任何人都可以访问路由
return true;
}
}
export default actions;
解决用户直接输入网址访问的问题
import jwt_decode from 'jwt-decode';
router.beforeEach((to, form, next) => { //拦截上面配置的路由
// 获取用户登录状态
var isLogin = localStorage.getItem("token") != null ? true : false;
// 注销
if (to.path == '/logout') {
// 清空
localStorage.clear()
// 跳转到登录
next({path: '/login'});
}
if (to.path != '/login' && to.path != '/password') {
//如果没有登录
if (isLogin == false) {
next({path: '/login'});
}
//如果已经登录,判断是否具有访问该路由的资格
else {
const decoded: any=jwt_decode(localStorage. tsToken);
const { user_roles }=decoded;
// @ts-ignore
if (hasPermission(user_roles,to)) {
next();
} else {
next('/404'); // 没有权限进入
}
}
}
// 下一个路由
next();
});
function hasPermission(roles: any, route: any) {
if (route.meta && route.meta.roles) {
//roles是自己设置的一个数组
return route.meta.roles.some((role: string) => role.indexOf(roles) >= 0)
}else {
//如果当前路由对象routes.meta没有roles属性,表示任何人都可以访问路由
return true;
}
}
export default router
方式2:
router.addrouters

浙公网安备 33010602011771号