SvelteKit中是否有类似Angular route guards的路由管控功能?
SvelteKit 类Angular Route Guard 路由权限管控最优方案
SvelteKit没有内置名为“路由守卫”的API,但可以通过官方原生的load函数、路由组特性实现同等甚至安全性更高的权限管控效果,推荐按你的部署场景选择以下方案:
方案1:服务端load函数校验(优先推荐,SSR/SSG场景通用)
这是安全性最高的方案,校验逻辑完全在服务端执行,未授权用户拿不到受保护页面的任何代码和数据:
- 整站通用的登录态校验放在根目录
+layout.server.ts的load函数中统一处理 - 特定路由的角色权限校验放在对应路由目录的
+page.server.ts/+layout.server.ts中实现 - 校验不通过时直接调用
redirect()跳转登录页,或调用error()抛出403无权限提示 - 同权限的批量路由可以放在同一个路由组目录(比如
(admin))下,只需写一份layout级别的校验逻辑即可覆盖所有子路由
代码示例:
// src/routes/(admin)/+layout.server.ts import { redirect, error } from '@sveltejs/kit'; import type { LayoutServerLoad } from './$types'; export const load: LayoutServerLoad = async ({ locals }) => { // locals.user 是你在hooks.server.ts中预处理登录态后挂载的用户信息 if (!locals.user) { throw redirect(302, '/login?redirect=/admin'); } if (locals.user.role !== 'admin') { throw error(403, '仅管理员可访问该页面'); } return { user: locals.user }; };
方案2:客户端load函数校验(仅纯静态SPA场景使用)
如果你完全关闭了服务端渲染,部署纯客户端SPA,可以用客户端侧的+layout.ts/+page.ts的load函数实现校验,逻辑和服务端方案完全一致。
注意:客户端校验仅用于优化用户体验,所有敏感接口、数据操作必须在服务端做二次权限校验,避免前端校验被绕开。
方案3:可复用守卫封装(多权限场景提效)
如果项目有大量不同权限的路由,可以把校验逻辑抽成通用的高阶函数复用,实现类似Angular可插拔守卫的效果:
// src/lib/routeGuards.ts import { redirect, error } from '@sveltejs/kit'; // 登录态校验守卫 export const requireAuth = (user: App.Locals['user']) => { if (!user) throw redirect(302, '/login'); return user; }; // 角色权限校验守卫 export const requireRole = (user: App.Locals['user'], allowedRoles: string[]) => { requireAuth(user); if (!allowedRoles.includes(user.role)) throw error(403, '无权访问'); return user; };
在路由load中直接调用即可:
export const load: LayoutServerLoad = async ({ locals }) => { const user = requireRole(locals.user, ['admin', 'editor']); return { user }; };
内容的提问来源于stack exchange,提问作者Sneharghya Pathak
相关产品推荐
相关产品推荐

