路由守卫

通过配置 guardedPaths 和 guestPaths,框架自动注入全局路由守卫中间件,实现登录拦截和已登录重定向。

配置

// nuxt.config.ts
swiftConfig: {
  auth: {
    // 需要登录才能访问的路径(路径前缀匹配)
    guardedPaths: ['/mine', '/dashboard', '/settings'],

    // 已登录时不可访问的路径(如登录页、注册页)
    // 已登录用户访问这些路径会被重定向到首页
    guestPaths: ['/login', '/register'],
  }
}

守卫行为

路径类型未登录访问已登录访问
guardedPaths 中的路径重定向到 /login?redirect=原路径正常访问
guestPaths 中的路径正常访问重定向到 /(首页)
其他路径正常访问正常访问

路径匹配规则

使用前缀匹配:guardedPaths: ['/mine'] 会匹配 /mine、/mine/favorites、/mine/settings 等所有以 /mine 开头的路径。

登录成功后的重定向

守卫将原始路径存入查询参数 ?redirect=,登录成功后,useLoginBy() 会自动读取并跳转到登录前的页面。

自定义守卫逻辑

如需更复杂的守卫逻辑(如基于角色的权限控制),可在 app/middleware/ 中创建自定义中间件:

// app/middleware/auth.global.ts
export default defineNuxtRouteMiddleware(async (to) => {
  const userStore = useUserStore()

  // 自定义:管理员页面需要 admin 角色
  if (to.path.startsWith('/admin')) {
    const loggedIn = await useLoginCheck()
    if (!loggedIn) return navigateTo('/login')
    if (!userStore.info?.isAdmin) return navigateTo('/')
  }
})

安全行为

framework 内置两条 auth 相关的安全行为,无需额外配置即默认生效:

拒绝 URL 注入的渠道码

systemStore.initCode()(由 framework 插件在初始化时调用)检测到 ?switch=1 路径下从 URL query 注入的渠道码(?code=...)会被拒绝, 防止恶意分享链接劫持业务渠道归因。仅站内合法路径下的渠道码切换会被接受。

logout 先撤销服务端会话,再同步清理本地状态

调用框架登出流程(userStore.logout())时,会先向后端 POST /login/logout 撤销当前会话——失败静默吞掉、不阻断登出(网络故障 / 后端未实现该端点时本地照清,零适配成本)——随后同步清空:

  • 渠道码 cookie(Set-Cookie: code=; Max-Age=0)
  • IDB 解密缓存(如 useDecryptedAsset 缓存的解密 blob URL)
  • 约定登录凭证 localStorage(防止登出后下个用户登录时拿到上个用户的凭证残留)

避免登出残留信息泄漏到下个会话或下个用户,同时保证原 token 在服务端立即失效——「用户已登出」重新成为一道真实防线(对齐 OWASP 会话管理要求)。

延伸阅读