路由守卫简单来说就是前端的权限控制,有人可能会有所疑问,后端接口不是已经有权限控制了吗,为什么还需要前端的权限控制呢?

前端的权限是前端的,后端的权限是后端的。两者不能混为一谈。

一般后台权限用shiro控制,前端也有自己的权限管理,比如下面这种情况:项目开发了很多页面,不同的页面分配给不同的角色。角色A只能访问路由A和路由B,而角色B只能访问路由C和路由D,那么有一天,角色A拿到了路由C的地址,在浏览器里输入路由C的地址会怎么样呢?有可能会越权访问到自己不应该看到的页面。

而比较正确的做法是,前端通过路由守卫,限制用户的访问一些路由,保护路由的安全。

1.全局前置路由守卫

我们打开我们的路由信息,参考下面的代码增加全局路由守卫,注意,此时你的router需要使用export default 这种形式。

router.beforeEach(()=>{
    console.log("123")
})

可以看出,每次访问新路由之前都会调用beforeEach这个函数。

beforeEach中有三个参数,分别是to、from、next。to表示去哪里,from表示从什么地方来,next俗称放行。比如下面这种写法就会放行所有的路由。

//全局前置路由守卫
router.beforeEach((to,from,next)=>{
    console.log("123")
    next()
})

那么如果我们在next外包围一层if用来判断是否放行这样就能实现简单的前端权限控制了。

//全局前置路由守卫
router.beforeEach((to,from,next)=>{
    console.log("123")
    var a=1;
    var b=0;
    if(a<b){
        next()
    }else{
        alert("您无权访问此页面")
    }
})

上面的前置路由守卫有个小缺点,就是路由越多,需要判断的也就越多,事实上不是所有的页面都需要前端的权限管理。有的页面不需要权限管理,有的页面需要权限管理,这个时候就应该按需使用。

我们打印上面to和from,可以看到有meta这个属性

我们只要在需要鉴权的路由处加上 meta:{isAuth:false} 即可。

2.全局后置路由守卫

后置路由守卫是在切换后进行调用的函数,一般用的不多,用法如下:

//全局后置路由守卫
router.afterEach((to,from)=>{
    console.log(to)
    console.log(from)
})

用法之一是改变页面title,比如下面这样:

注意上面,页面title的变化。

3.独享路由守卫

独享路由守卫用的也不多,表示只对某一个路由进行鉴权判断,用beforeEnter,参数和前置路由守卫一样,比如下面这样

 children: [
                {
                    path: 'stuA/:name/:type',
                    component: StudentA,
                    meta:{isAuth:true,title:"学生A"},
                    //独享路由守卫
                    beforeEnter:(to,from,next)=>{
                        next()
                    }
                },

那么,上面这个路由自己独享一个路由守卫。

4.组件内路由守卫

上面几种情况都是在路由文件里书写的路由守卫,我们也可以直接在某个组件内使用路由守卫beforeRouteEnter、beforeRouteLeave

beforeRouteEnter是通过路由规则,进入该组件时被调用。beforeRouteLeave是通过路由规则,离开该组件时被调用。

分类: 前端