2026-05-25: 等级体系升级(20级)+论坛二级分类+会员空间
This commit is contained in:
@@ -2,25 +2,45 @@
|
||||
|
||||
## 技术栈
|
||||
- NextAuth.js v4
|
||||
- Credentials Provider(用户名密码 + 用户邮箱密码)
|
||||
- Credentials Provider(用户邮箱密码)
|
||||
- GitHub OAuth Provider
|
||||
- JWT Session策略
|
||||
- bcrypt 密码加密
|
||||
|
||||
## 配置 (`src/lib/auth.ts`)
|
||||
|
||||
### 管理员认证
|
||||
- 唯一凭证: `admin@zhuiguang.ai` / `admin123`
|
||||
- 硬编码在auth.ts中,非数据库查询
|
||||
|
||||
### 用户认证
|
||||
- 邮箱+密码注册/登录
|
||||
- 用户数据存储在User表
|
||||
- 密码bcrypt加密
|
||||
- GitHub OAuth登录(自动创建/关联用户)
|
||||
- 登录频率限制: 7次/分钟
|
||||
|
||||
### 登录流程
|
||||
1. 用户输入邮箱+密码
|
||||
2. 检查登录频率限制
|
||||
3. 查询User表获取用户
|
||||
4. bcrypt.compare验证密码
|
||||
5. 返回用户信息(id, email, name, role)
|
||||
6. JWT回调将用户信息加入token
|
||||
7. Session回调将token信息传递给session
|
||||
|
||||
### GitHub OAuth流程
|
||||
1. 用户点击GitHub登录
|
||||
2. 重定向到GitHub授权
|
||||
3. 回调获取profile信息
|
||||
4. 检查oauthProvider+oauthId是否已存在
|
||||
5. 不存在则创建新用户
|
||||
6. 返回用户信息
|
||||
|
||||
### Session策略
|
||||
- 使用JWT,不使用数据库session
|
||||
- JWT密钥: `NEXTAUTH_SECRET` 环境变量
|
||||
- Session有效期: 30天
|
||||
- Token包含: id, role
|
||||
|
||||
### 回调函数
|
||||
- `signIn`: GitHub OAuth自动创建用户
|
||||
- `jwt`: 登录时将用户信息加入token
|
||||
- `session`: 将token中的用户信息传递给session
|
||||
|
||||
@@ -28,31 +48,67 @@
|
||||
|
||||
### 保护规则
|
||||
- 保护 `/admin` 下所有路由
|
||||
- 保护 `/api/admin/:path*` 路由
|
||||
- 保护 `/api/user/:path*` 路由
|
||||
- 跳过 `/admin/login`
|
||||
- 使用NextAuth middleware进行认证检查
|
||||
|
||||
### 登录流程
|
||||
1. 访问 `/admin/*` → middleware检查session
|
||||
2. 未登录 → 重定向到 `/admin/login`
|
||||
3. 登录页提交表单 → Server Action验证凭证
|
||||
4. 验证成功 → 重定向到 `/admin`
|
||||
### 权限检查
|
||||
- 检查token是否存在
|
||||
- 检查role是否为admin或vip
|
||||
- 未登录重定向到 /admin/login
|
||||
- 无权限返回401/403
|
||||
|
||||
## 管理员API认证 (`src/lib/admin-auth.ts`)
|
||||
|
||||
### getAdminSession
|
||||
- 获取当前会话
|
||||
- 验证用户角色
|
||||
- 支持role字符串和roleId双重验证
|
||||
- 缓存机制(React cache)
|
||||
|
||||
### requireAdmin中间件
|
||||
- 所有 `/api/admin/` 路由必须使用requireAdmin中间件
|
||||
- 验证流程: 检查session → 验证邮箱是否为admin@zhuiguang.ai
|
||||
- 已覆盖28个后台API端点
|
||||
- 验证流程: 检查session → 验证角色
|
||||
- 返回401/403错误响应
|
||||
|
||||
### getUserPermissionKeys
|
||||
- 获取用户权限键集合
|
||||
- 基于roleId关联Role表查询
|
||||
- 缓存机制
|
||||
|
||||
### requirePermission
|
||||
- 细粒度权限点校验
|
||||
- 检查permissionKeys是否包含指定key
|
||||
- 返回403如果缺少权限
|
||||
|
||||
### getAllUserPermissions
|
||||
- 获取当前用户全部权限集合
|
||||
- 支持admin角色(返回全部权限)
|
||||
- 支持roleId关联角色
|
||||
|
||||
## 前端权限Hook (`src/lib/use-permission.ts`)
|
||||
|
||||
### usePermission
|
||||
- 客户端Hook
|
||||
- 获取当前用户权限
|
||||
- 缓存机制
|
||||
- 提供方法:
|
||||
- `can(key)` — 检查单个权限
|
||||
- `canAny(keys)` — 检查任一权限
|
||||
- `canAll(keys)` — 检查全部权限
|
||||
- `refresh` — 刷新权限
|
||||
|
||||
## 登录页
|
||||
- 管理员登录: `src/app/(admin)/admin/login/page.tsx` (原生HTML表单 + CSRF Token)
|
||||
- 用户登录: `src/app/login/page.tsx` (NextAuth Credentials + GitHub OAuth)
|
||||
- 用户登录弹窗: `src/components/common/LoginModal.tsx`
|
||||
- 登录表单: `src/components/common/LoginForm.tsx`
|
||||
|
||||
## 环境变量
|
||||
```
|
||||
NEXTAUTH_URL=http://localhost:3100
|
||||
NEXTAUTH_SECRET=<secret>
|
||||
GITHUB_ID=<github-oauth-id>
|
||||
GITHUB_SECRET=<github-oauth-secret>
|
||||
NEXTAUTH_URL=http://localhost:8301
|
||||
NEXTAUTH_SECRET=zhuiguang-ai-dev-secret
|
||||
GITHUB_CLIENT_ID=<github-oauth-client-id>
|
||||
GITHUB_CLIENT_SECRET=<github-oauth-secret>
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user