11 KiB
11 KiB
Supabase 消息系统部署清单
本清单确保您在Supabase中正确配置消息系统的权限策略和功能。
🎯 部署选项
选项1:一键部署(推荐新手)
-- 在Supabase SQL编辑器中执行
\i deploy_one_click.sql
优点:
- ✅ 自动化程度高,一步完成
- ✅ 包含环境检测和配置验证
- ✅ 自动创建便捷开发函数
- ✅ 生成详细的部署报告
包含内容:
- 数据库扩展检查与创建
- 基础表结构创建
- 开发权限模式部署
- 基础消息类型数据
- 便捷开发函数
- 部署结果验证
选项2:权限管理器模式
-- 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:手动分步部署
-- 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 |
权限管理器 | 所有环境 |
开发模式设置
快速开启开发模式:
-- 方法1:使用完整脚本
\i open_all_message_permissions.sql
-- 方法2:使用快速脚本
\i dev_open_permissions.sql
-- 方法3:使用管理函数
SELECT public.switch_to_dev_mode();
开发模式特点:
- ✅ 所有authenticated用户拥有完全权限
- ✅ 提供便捷开发函数
- ✅ 适合快速原型开发和测试
- ⚠️ 严禁在生产环境使用
生产模式设置
恢复生产模式:
-- 方法1:使用恢复脚本
\i restore_normal_permissions.sql
-- 方法2:使用管理函数(仅清理)
SELECT public.switch_to_prod_mode();
-- 然后手动运行完整的生产权限脚本
-- 方法3:重新部署完整权限
\i message_permissions_complete.sql
生产模式特点:
- 🔒 基于角色的严格权限控制
- 🎯 最小权限原则
- 🛡️ 数据安全保护
- ✅ 适合生产环境
权限状态检查
查看当前权限模式:
-- 查看权限模式
SELECT * FROM public.get_permission_mode();
-- 查看权限仪表板
SELECT * FROM public.permission_dashboard;
-- 详细策略列表
SELECT * FROM public.list_message_policies();
-- 权限健康检查
SELECT * FROM public.check_permission_health();
常用检查命令:
-- 快速状态检查
SELECT
mode,
CASE
WHEN dev_policies > 0 THEN '⚠️ 开发环境'
WHEN normal_policies > 0 THEN '✅ 生产环境'
ELSE '❌ 未配置'
END as status
FROM public.get_permission_mode();
🏗️ 数据库架构部署
1. 创建表结构
-- 首先执行主数据库架构
\i message_system.sql
-- 然后执行权限策略
\i supabase_message_permissions.sql
-- 最后插入测试数据
\i insert_test_message_data.sql
2. 启用必要的扩展
-- 在 Supabase SQL Editor 中执行
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- 用于文本搜索
🔐 认证和权限配置
1. JWT 配置
确保您的 Supabase JWT 包含用户角色信息:
{
"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. 用户表配置
确保用户表包含角色信息:
-- 检查用户表结构
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. 实时策略配置
-- 允许用户订阅自己的消息更新
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 文件:
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 中执行:
-- 测试用户只能查看自己的消息
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. 教师权限测试
-- 设置教师身份
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. 群组权限测试
-- 测试群组成员权限
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. 性能优化
-- 创建必要的索引
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. 备份策略
-- 定期备份重要数据
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. 检查函数参数类型匹配
📈 性能监控
关键指标
- 消息发送延迟
- 数据库查询时间
- 实时连接数量
- 错误率统计
优化建议
- 定期分析慢查询
- 监控索引使用情况
- 优化复杂权限策略
- 考虑数据分区策略
完成部署后,使用提供的测试用户 ID 进行功能验证:
- 教师:
7bf7378e-a027-473e-97ac-3460ed3f170a - 学生:
eed3824b-bba1-4309-8048-19d17367c084