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

 

posted @ 2019-06-28 17:01  小名的同学  阅读(473)  评论(0编辑  收藏  举报