当前位置: 首页 > 知识库问答 >
问题:

是否可以使用Vue路由器中的beforeEnter导航保护来重定向用户?

颛孙正卿
2023-03-14

我正在使用Vue2和Vue Router 3.5构建SPA应用程序

应用程序有两个身份验证路径,“admin”和“organization”

我设置了路由器,这样每个授权保护在url中都有自己的前缀

'/auth/:防护'

'/组织'

/admin

路由器文件如下所示:


const routes = [
    organisations,
    authRoutes,
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

在组织文件内部,我返回一个对象:

export default {
    path: '/organisations',
    meta: { auth: true, guard: 'organisations' },
    component: () => import('../views/Organisations/OrganisationContainer.vue'),
    beforeEnter: (to, from, next) => {
        return store.dispatch('authentication/check')
            .then(response => {
                if(response) {
                    if(response.guard == 'admin') {
                        return next('/admin')
                    }
                    if(response.guard != 'organisation') {
                        return false
                    }
                }else{
                    return next('/auth/organisation/login')
                }
            })
    },
    children: [
        {
            path: '/',
            name: 'organisation.dash',
            meta: { auth: true, route_identifier: 'dashboard', title: 'Dashboard' },
            component: () => import('../views/Organisations/Dashboard/Dashboard.vue')
        },
}

在以前的项目中,我使用router.beforeEach来处理系统中的导航。

路由器的问题。beforeEach是因为我不希望有一个大的方法来处理系统中每条路线的导航。如果我能有这样的东西,那就容易多了

"如果有人试图访问 /organisation路由,但他们没有登录,请将用户重定向到路由 /auth/organisation/login如果他们已登录,但他们是管理员,请将用户重定向到他们的仪表板。"

我计划在 beforeEnter 之前使用它来实现这一点 - 但是每当我尝试使用 next() 函数重定向时,都会返回一个空白的白屏。如果我返回不带参数的 next() 函数,它不会重定向,但页面仍然加载。

我可能滥用了beforeEnter导航保护——但是有谁知道我如何使用beforeEnter导航保护重定向用户,或者在不使用beforeEach并有一个大方法要处理的情况下实现类似的功能吗?

提前致谢

共有1个答案

姚建树
2023-03-14

router.before的问题是,我不想有一个大的方法来处理系统中每条路线的导航。

这种方法没有任何问题,只要确保你的代码是快速的(不要使API调用在beford的每个),如果你有很多代码,没有什么可以阻止你把代码分成多个函数,所以它更具可读性。

但是,如果您确实不需要使用< code>beforeEach,并且您只有几条具有特定要求的路线,您可以使用< code>beforeEnter,但它与< code>beforeEach略有不同。。首先,在您提供的代码片段中,您在路由上定义了一个< code>beforeEach回调,但是beforeEach是一个路由器级回调,如docs中所述。

您必须更改代码段,将< code>beforeEach替换为< code>beforeEnter,如下所示:

export default {
    path: '/organisations',
    meta: { auth: true, guard: 'organisations' },
    component: () => import('../views/Organisations/OrganisationContainer.vue'),
    beforeEnter: (to, from, next) => {
        return store.dispatch('authentication/check')
            .then(response => {
                if(response) {
                    if(response.guard == 'admin') {
                        return next('/admin')
                    }
                    if(response.guard != 'organisation') {
                        return false
                    }
                }else{
                    return next('/auth/organisation/login')
                }
            })
    },
    children: [
        {
            path: '/',
            name: 'organisation.dash',
            meta: { auth: true, route_identifier: 'dashboard', title: 'Dashboard' },
            component: () => import('../views/Organisations/Dashboard/Dashboard.vue')
        },
}
 类似资料:
  • 我的 vue 路由器中有这条路由.js文件. 我使用 beforeEnter 选项重定向用户,如果store.state.is_login === true 第一个问题:所以当我在浏览器中输入网址时,我会重定向到/登录页面。这很好。但是当我单击徽标按钮时,这个beforeEnter功能不起作用。这是我的按钮,使用: 第二个问题是: is_login在我的store.state。is_login 我

  • 我有一个用material UI设计的web应用程序,正如你们在下面看到的,我使用按钮导航来浏览我的基本登录页组件。 我曾尝试将React Router与这些预定义的导航组件一起使用,但没有成功,有没有可能将Router与材质UI的按钮导航一起使用?物料界面中的按钮导航文章ButtonNavigation API

  • 我正在结合Vuex和vue路由器构建Vuetify应用程序。一些视图使用默认的导航抽屉,但其他视图的导航抽屉中有不同的项。这篇文档说我可以通过道具来查看组件。所以我这样实现它: 但显然, 但是<代码>

  • 在导航到我拥有的某些路由之前,尝试找出获取某些数据的最佳方法。 我的路线是: /messages, /posts /dashboard我想获取一些数据,同时显示一个旋转器。 Vue路由器文档建议在路由器之前使用,在导航之前获取 但我的问题是,我必须在所有三个视图组件中实现这个获取逻辑吗?由于提取的是相同的数据,我不想在每个组件中重复逻辑。 在我的根组件中没有调用beForeRouteEnter,在

  • 我想在单击登录页中的按钮后重定向到主页。但是,当我单击地址栏中的按钮时,主页的路径会显示出来(它重定向到主页)…但它不会呈现与该路径相关的组件。它仍然显示带有主页地址的登录页。因此,我必须刷新页面才能呈现主页。这里有什么问题??? 在我的登录页面中…这是我用于单击按钮的功能。。 在我的索引,js页面...