跳到主要内容

路由守卫

ChikoAdmin 通过 createRouteGuard 函数实现路由守卫,支持登录验证、权限控制等功能。

路由守卫原理

路由守卫在路由跳转前执行,用于:

  • 验证用户登录状态
  • 检查用户权限
  • 处理重定向逻辑
  • 控制路由访问

createRouteGuard 函数

// src/pages/layout.tsx
function createRouteGuard(
to: Router.Route,
roles: string[],
isSuper: boolean,
previousRoute: Router.Route | null
) {
const loginRoute = '/login';
const isLogin = Boolean(localStg.get('token'));
const notFoundRoute = 'notFound';
const isNotFoundRoute = to.id === notFoundRoute;

// 未登录状态处理
if (!isLogin) {
if (to.handle.constant && !isNotFoundRoute) {
return null; // 常量路由允许访问
}
// 重定向到登录页,并记录原路径
const query = to.fullPath;
return `${loginRoute}?redirect=${query}`;
}

const rootRoute = '/';
const noAuthorizationRoute = '/403';
const needLogin = !to.handle.constant;
const routeRoles = to.handle.roles || [];

// 检查用户角色权限
const hasRole = roles.some(role => routeRoles.includes(role));
const hasAuth = isSuper || !routeRoles.length || hasRole;

// 已登录用户访问登录页,重定向到首页
if (to.fullPath.includes('login') && to.pathname !== '/login-out' && isLogin) {
return rootRoute;
}

// 404 路由处理
if (to.id === 'notFound') {
const exist = matchRoutes(allRoutes[0].children || [], to.pathname);
if (exist && exist.length > 1) {
return noAuthorizationRoute;
}
return null;
}

// 常量路由不需要登录验证
if (!needLogin) {
return handleRouteSwitch(to, previousRoute);
}

// 权限不足时重定向到 403 页面
if (!hasAuth && import.meta.env.VITE_AUTH_ROUTE_MODE === 'static') {
return noAuthorizationRoute;
}

return handleRouteSwitch(to, previousRoute);
}

守卫逻辑说明

登录状态检查

// 检查用户是否已登录
const isLogin = Boolean(localStg.get('token'));

if (!isLogin) {
if (to.handle.constant && !isNotFoundRoute) {
return null; // 常量路由允许访问
}
// 重定向到登录页
return `${loginRoute}?redirect=${query}`;
}

权限验证

// 检查用户角色权限
const routeRoles = to.handle.roles || [];
const hasRole = roles.some(role => routeRoles.includes(role));
const hasAuth = isSuper || !routeRoles.length || hasRole;

// 权限不足时重定向到 403 页面
if (!hasAuth && import.meta.env.VITE_AUTH_ROUTE_MODE === 'static') {
return noAuthorizationRoute;
}

特殊路由处理

// 已登录用户访问登录页,重定向到首页
if (to.fullPath.includes('login') && to.pathname !== '/login-out' && isLogin) {
return rootRoute;
}

// 404 路由处理
if (to.id === 'notFound') {
const exist = matchRoutes(allRoutes[0].children || [], to.pathname);
if (exist && exist.length > 1) {
return noAuthorizationRoute;
}
return null;
}

路由类型

常量路由

无需登录验证的路由:

/**
* @handle {
* title: '登录',
* constant: true
* }
*/
export default function LoginPage() {
return <div>登录页面</div>;
}

权限路由

需要特定角色才能访问的路由:

/**
* @handle {
* title: '管理员面板',
* roles: ['R_Admin']
* }
*/
export default function AdminPage() {
return <div>管理员页面</div>;
}

公开路由

所有已登录用户都可以访问的路由:

/**
* @handle {
* title: '首页'
* }
*/
export default function HomePage() {
return <div>首页</div>;
}

环境变量配置

# 权限路由模式:static(静态) 或 dynamic(动态)
VITE_AUTH_ROUTE_MODE=static

# 超级管理员角色标识
VITE_STATIC_SUPER_ROLE=R_SUPER

常见场景

登录重定向

用户访问需要登录的页面时,自动重定向到登录页并记录原路径。

权限不足

用户访问没有权限的页面时,重定向到 403 页面。

已登录用户访问登录页

已登录用户访问登录页时,自动重定向到首页。

404 处理

访问不存在的路由时,根据情况重定向到 403 或显示 404 页面。