# Supabase 消息系统部署清单 本清单确保您在Supabase中正确配置消息系统的权限策略和功能。 ## 🎯 部署选项 ### 选项1:一键部署(推荐新手) ```sql -- 在Supabase SQL编辑器中执行 \i deploy_one_click.sql ``` **优点:** - ✅ 自动化程度高,一步完成 - ✅ 包含环境检测和配置验证 - ✅ 自动创建便捷开发函数 - ✅ 生成详细的部署报告 **包含内容:** - 数据库扩展检查与创建 - 基础表结构创建 - 开发权限模式部署 - 基础消息类型数据 - 便捷开发函数 - 部署结果验证 ### 选项2:权限管理器模式 ```sql -- 1. 部署权限管理器 \i permission_manager.sql -- 2. 查看当前状态 SELECT * FROM public.permission_dashboard; -- 3. 智能切换权限模式 SELECT public.switch_to_dev_mode(); -- 开发模式 SELECT public.switch_to_prod_mode(); -- 生产模式 -- 4. 健康检查 SELECT * FROM public.check_permission_health(); ``` **优点:** - 🎛️ 提供完整的权限管理界面 - 🔄 支持权限模式智能切换 - 📊 实时权限状态监控 - 🔍 权限健康检查和诊断 ### 选项3:手动分步部署 ```sql -- 1. 基础表结构 \i message_system.sql -- 2. 用户角色系统(生产环境) \i supabase_auth_complete_setup.sql -- 3. 权限策略 -- 开发环境 \i dev_open_permissions.sql -- 或生产环境 \i message_permissions_complete.sql -- 4. 测试数据 \i insert_test_message_data.sql ``` **优点:** - 🎯 精确控制每个部署步骤 - 🛠️ 便于调试和故障排除 - 📝 适合学习和理解系统架构 - 🔧 支持自定义配置 ## 🔄 权限模式管理 ### 权限模式脚本列表 | 脚本文件 | 用途 | 适用环境 | |----------|------|----------| | `open_all_message_permissions.sql` | 完整开放权限脚本 | 开发/测试 | | `dev_open_permissions.sql` | 快速开发权限脚本 | 开发/测试 | | `restore_normal_permissions.sql` | 恢复正常权限脚本 | 生产环境 | | `permission_manager.sql` | 权限管理器 | 所有环境 | ### 开发模式设置 **快速开启开发模式:** ```sql -- 方法1:使用完整脚本 \i open_all_message_permissions.sql -- 方法2:使用快速脚本 \i dev_open_permissions.sql -- 方法3:使用管理函数 SELECT public.switch_to_dev_mode(); ``` **开发模式特点:** - ✅ 所有authenticated用户拥有完全权限 - ✅ 提供便捷开发函数 - ✅ 适合快速原型开发和测试 - ⚠️ **严禁在生产环境使用** ### 生产模式设置 **恢复生产模式:** ```sql -- 方法1:使用恢复脚本 \i restore_normal_permissions.sql -- 方法2:使用管理函数(仅清理) SELECT public.switch_to_prod_mode(); -- 然后手动运行完整的生产权限脚本 -- 方法3:重新部署完整权限 \i message_permissions_complete.sql ``` **生产模式特点:** - 🔒 基于角色的严格权限控制 - 🎯 最小权限原则 - 🛡️ 数据安全保护 - ✅ 适合生产环境 ### 权限状态检查 **查看当前权限模式:** ```sql -- 查看权限模式 SELECT * FROM public.get_permission_mode(); -- 查看权限仪表板 SELECT * FROM public.permission_dashboard; -- 详细策略列表 SELECT * FROM public.list_message_policies(); -- 权限健康检查 SELECT * FROM public.check_permission_health(); ``` **常用检查命令:** ```sql -- 快速状态检查 SELECT mode, CASE WHEN dev_policies > 0 THEN '⚠️ 开发环境' WHEN normal_policies > 0 THEN '✅ 生产环境' ELSE '❌ 未配置' END as status FROM public.get_permission_mode(); ``` ## 🏗️ 数据库架构部署 ### 1. 创建表结构 ```sql -- 首先执行主数据库架构 \i message_system.sql -- 然后执行权限策略 \i supabase_message_permissions.sql -- 最后插入测试数据 \i insert_test_message_data.sql ``` ### 2. 启用必要的扩展 ```sql -- 在 Supabase SQL Editor 中执行 CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- 用于文本搜索 ``` ## 🔐 认证和权限配置 ### 1. JWT 配置 确保您的 Supabase JWT 包含用户角色信息: ```json { "aud": "authenticated", "exp": 1234567890, "sub": "user-uuid-here", "email": "user@example.com", "role": "authenticated", "user_role": "teacher", // 重要:自定义角色字段 "app_metadata": { "provider": "email", "providers": ["email"] }, "user_metadata": { "user_role": "teacher" // 备用角色字段 } } ``` ### 2. 用户表配置 确保用户表包含角色信息: ```sql -- 检查用户表结构 SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_name = 'ak_users' AND table_schema = 'public'; -- 添加角色列到用户表(如果还没有) ALTER TABLE public.ak_users ADD COLUMN IF NOT EXISTS role VARCHAR(20) DEFAULT 'student', ADD COLUMN IF NOT EXISTS user_type VARCHAR(20) DEFAULT 'student', ADD COLUMN IF NOT EXISTS class_id UUID; -- 用于班级关联 -- 更新测试用户角色 UPDATE public.ak_users SET role = 'teacher', user_type = 'teacher' WHERE id = '7bf7378e-a027-473e-97ac-3460ed3f170a'; UPDATE public.ak_users SET role = 'student', user_type = 'student' WHERE id = 'eed3824b-bba1-4309-8048-19d17367c084'; -- 如果需要,可以创建班级表和师生关系 -- CREATE TABLE IF NOT EXISTS public.ak_classes ( -- id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- name VARCHAR(100) NOT NULL, -- description TEXT, -- teacher_id UUID REFERENCES public.ak_users(id), -- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() -- ); ``` ## 📊 实时订阅配置 ### 1. 在 Supabase 控制台中启用实时功能 **Database → Replication** - 选择需要实时订阅的表: - ✅ `ak_messages` - ✅ `ak_message_recipients` - ✅ `ak_message_groups` - ✅ `ak_message_group_members` ### 2. 实时策略配置 ```sql -- 允许用户订阅自己的消息更新 ALTER PUBLICATION supabase_realtime ADD TABLE public.ak_messages; ALTER PUBLICATION supabase_realtime ADD TABLE public.ak_message_recipients; ALTER PUBLICATION supabase_realtime ADD TABLE public.ak_message_groups; ALTER PUBLICATION supabase_realtime ADD TABLE public.ak_message_group_members; ``` ## 🔧 客户端环境变量 创建 `.env.local` 文件: ```env NEXT_PUBLIC_SUPABASE_URL=your-supabase-project-url NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key SUPABASE_SERVICE_ROLE_KEY=your-service-role-key # 仅服务端使用 ``` ## 🧪 权限策略测试 ### 1. 基本权限测试 在 Supabase SQL Editor 中执行: ```sql -- 测试用户只能查看自己的消息 SET LOCAL role = 'authenticated'; SET LOCAL "request.jwt.claims" = '{"sub": "eed3824b-bba1-4309-8048-19d17367c084", "user_role": "student"}'; -- 应该只返回学生相关的消息 SELECT COUNT(*) FROM ak_messages; SELECT COUNT(*) FROM ak_message_recipients WHERE recipient_id = 'eed3824b-bba1-4309-8048-19d17367c084'::uuid; -- 重置 RESET role; ``` ### 2. 教师权限测试 ```sql -- 设置教师身份 SET LOCAL role = 'authenticated'; SET LOCAL "request.jwt.claims" = '{"sub": "7bf7378e-a027-473e-97ac-3460ed3f170a", "user_role": "teacher"}'; -- 测试教师可以发送系统消息 INSERT INTO ak_messages ( message_type_id, sender_type, sender_id, receiver_type, receiver_id, title, content ) VALUES ( (SELECT id FROM ak_message_types WHERE code = 'assignment'), 'user', '7bf7378e-a027-473e-97ac-3460ed3f170a', 'user', 'eed3824b-bba1-4309-8048-19d17367c084', '权限测试消息', '这是一条测试教师权限的消息' ); -- 重置 RESET role; ``` ### 3. 群组权限测试 ```sql -- 测试群组成员权限 SET LOCAL role = 'authenticated'; SET LOCAL "request.jwt.claims" = '{"sub": "eed3824b-bba1-4309-8048-19d17367c084", "user_role": "student"}'; -- 学生应该能看到自己参与的群组 SELECT * FROM ak_message_groups; -- 重置 RESET role; ``` ## 📱 前端集成检查清单 ### 1. 认证流程 - [ ] 用户登录后正确设置角色信息 - [ ] JWT 包含 `user_role` 字段 - [ ] 角色信息在用户会话中持久化 ### 2. 消息功能 - [ ] 用户只能看到自己有权限的消息 - [ ] 教师可以向学生发送消息 - [ ] 学生可以标记消息为已读 - [ ] 群组消息正常工作 ### 3. 实时功能 - [ ] 新消息实时推送给正确的用户 - [ ] 消息状态变化实时同步 - [ ] 订阅自动受权限策略保护 ### 4. 错误处理 - [ ] 权限不足时显示友好错误信息 - [ ] 网络错误重试机制 - [ ] 操作失败回滚机制 ## 🚀 生产环境部署 ### 1. 性能优化 ```sql -- 创建必要的索引 CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_messages_recipient_user ON ak_message_recipients (recipient_id, recipient_type) WHERE recipient_type = 'user'; CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_messages_sender_user ON ak_messages (sender_id, sender_type) WHERE sender_type = 'user'; CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_messages_created_at_desc ON ak_messages (created_at DESC); -- 分析表统计信息 ANALYZE ak_messages; ANALYZE ak_message_recipients; ANALYZE ak_message_groups; ``` ### 2. 监控和日志 在 Supabase 控制台中: - **Logs** → 查看数据库日志 - **API** → 监控 API 使用情况 - **Auth** → 监控认证失败 ### 3. 备份策略 ```sql -- 定期备份重要数据 pg_dump -h your-db-host -U postgres -d your-db-name \ --table=ak_messages \ --table=ak_message_recipients \ --table=ak_message_groups \ --table=ak_user_message_preferences \ > message_system_backup.sql ``` ## 🔒 安全检查清单 ### 1. 权限策略审查 - [ ] 所有表都启用了 RLS - [ ] 用户只能访问自己的数据 - [ ] 敏感操作需要适当权限 - [ ] 没有权限泄露或越权访问 ### 2. 数据验证 - [ ] 输入数据经过验证和清理 - [ ] 防止 SQL 注入攻击 - [ ] 文件上传安全检查 - [ ] 敏感信息加密存储 ### 3. 网络安全 - [ ] 启用 HTTPS - [ ] 配置 CORS 策略 - [ ] API 速率限制 - [ ] 防止暴力破解 ## 📞 故障排查 ### 常见问题和解决方案 **问题1:权限被拒绝错误** ``` 解决方案: 1. 检查用户是否已认证 2. 验证 JWT 中的角色信息 3. 确认 RLS 策略配置正确 4. 检查表权限设置 ``` **问题2:实时订阅不工作** ``` 解决方案: 1. 确认表已添加到实时发布 2. 检查 RLS 策略是否阻止订阅 3. 验证客户端连接状态 4. 查看浏览器开发者工具错误 ``` **问题3:消息发送失败** ``` 解决方案: 1. 检查消息类型是否存在 2. 验证接收者ID有效性 3. 确认发送者有权限发送该类型消息 4. 检查函数参数类型匹配 ``` ## 📈 性能监控 ### 关键指标 - 消息发送延迟 - 数据库查询时间 - 实时连接数量 - 错误率统计 ### 优化建议 1. 定期分析慢查询 2. 监控索引使用情况 3. 优化复杂权限策略 4. 考虑数据分区策略 --- **完成部署后,使用提供的测试用户 ID 进行功能验证:** - 教师:`7bf7378e-a027-473e-97ac-3460ed3f170a` - 学生:`eed3824b-bba1-4309-8048-19d17367c084`