MuseMVP 文档
权限控制

权限架构

梳理 Better Auth 入口、会话行为与角色中间件边界。

MuseMVP 的权限架构核心基于 Better Auth 框架构建,提供了安全、灵活且易于扩展的身份验证解决方案。我们通过统一的配置文件和中间件,实现了从用户登录、会话管理到权限控制的全链路覆盖。

设计原则

采用基于中间件的轻量级权限控制,业务决策放在 layout/page 层,避免 middleware 承担过多逻辑。

认证入口

服务端配置

src/backend/auth/auth.ts — 定义 Better Auth 核心选项、插件(admin、2FA、emailOTP、captcha、apiKey)及 Drizzle 数据库适配器。

客户端辅助

src/backend/auth/client.ts — 提供前端使用的 hooks 和工具函数(useSession、signIn、signOut)。

API 路由挂载

src/backend/api/routes/auth.ts — 将 Better Auth 处理逻辑挂载到 Hono API。


核心配置

认证行为在 src/config/index.tsauth 对象中配置,分为 auth.gatesauth.lifecycle

功能开关

配置项类型默认值说明
gates.allowRegisterbooleantrue是否开放新用户注册。关闭后仅管理员可添加用户。
gates.allowSocialSignInbooleantrue是否启用社交登录(GitHub、Google)。需配置 OAuth 环境变量。
gates.allowPasswordSignInbooleantrue是否允许邮箱/密码登录。
gates.allowTwoFactorAuthbooleantrue是否启用双因素认证(2FA)。

会话与跳转

配置项默认值说明
lifecycle.redirectAfterLogin"/app"登录成功后跳转路径。
lifecycle.redirectAfterSignOut"/"退出登录后跳转路径。
lifecycle.redirectWhenSessionExpired"/auth/login"会话过期或未登录时的重定向路径。
lifecycle.sessionTtlSeconds30天会话 Cookie 有效期(秒)。

配置示例

// src/config/index.ts
auth: {
  gates: {
    allowRegister: true,
    allowSocialSignIn: true,
    allowPasswordSignIn: true,
    allowTwoFactorAuth: true,
  },
  lifecycle: {
    redirectAfterLogin: "/app",
    redirectAfterSignOut: "/",
    redirectWhenSessionExpired: "/auth/login",
    sessionTtlSeconds: 60 * 60 * 24 * 30,
  },
}

角色与管理员权限

采用基于中间件的轻量级权限控制:

用户鉴权 (src/backend/api/middleware/auth.ts):拦截未登录请求并返回 401,验证会话有效性。

管理员鉴权 (src/backend/api/middleware/admin.ts):在验证登录基础上检查 admin 角色,保护管理后台路由。

中间件链

管理路由使用 adminMiddleware,先验证会话,再检查 session.user.role === "admin"。非管理员用户将收到 403 Forbidden。

中间件应用范围行为
authMiddleware/api/aichat/api/api-keys/api/upload要求有效会话,缺失则返回 401
adminMiddleware/api/admin/*/api/openapi/api/docs要求会话 + admin 角色,非管理员返回 403

扩展点

src/backend/auth/auth.ts
src/i18n/translations/*/auth.json
  • 添加社交登录:在 src/backend/auth/auth.ts 中配置新 Provider,并在环境变量中添加对应 Key。
  • 自定义鉴权逻辑:通过编写自定义中间件或 Better Auth 插件扩展复杂权限(如基于组织的权限)。
  • 文案国际化:认证相关文案可配置,请同步维护 src/i18n/translations/*/auth.json 以支持多语言。

相关文档