面试题答案
一键面试-
路由配置:
- 在路由配置中,为每个路由添加
meta
字段,在meta
字段里定义权限相关信息。例如:
const routes = [ { path: '/parent/:parentId', name: 'Parent', component: ParentComponent, meta: { requiresAuth: true, roles: ['member', 'admin'] }, children: [ { path: 'child/:childId', name: 'Child', component: ChildComponent, meta: { requiresAuth: true, roles: ['admin'] } } ] } ];
requiresAuth
表示该路由是否需要登录,roles
表示允许访问该路由的角色。
- 在路由配置中,为每个路由添加
-
导航守卫:
- 使用全局前置守卫
router.beforeEach
来进行权限判断。
import router from './router'; import store from './store'; router.beforeEach((to, from, next) => { const userRole = store.getters.userRole; const requiresAuth = to.matched.some(record => record.meta.requiresAuth); const hasRole = to.matched.some(record => { const roles = record.meta.roles; return roles && roles.includes(userRole); }); if (requiresAuth &&!store.getters.isAuthenticated) { // 用户未登录,跳转到登录页面 next('/login'); } else if (requiresAuth && hasRole) { // 用户有访问权限,继续导航 next(); } else if (requiresAuth &&!hasRole) { // 用户无访问权限,跳转到403页面 next('/forbidden'); } else { // 不需要登录,继续导航 next(); } });
- 在守卫中,从
store
获取用户角色userRole
,通过to.matched
遍历匹配到的路由记录,判断是否需要登录以及用户是否有相应角色权限。
- 使用全局前置守卫
-
组件中:
- 在组件内部,可以通过
$route.meta
访问到当前路由的元信息。例如,如果需要在组件内根据权限动态显示某些元素:
<template> <div> <div v-if="$route.meta.roles.includes($store.getters.userRole)"> <button>只有特定角色可见的按钮</button> </div> </div> </template>
- 这样可以在组件渲染时,根据路由元信息和用户角色来决定是否渲染某些元素,进一步细化权限控制。
- 在组件内部,可以通过