# Supabase Auth 角色管理与消息系统部署指南 ## 📋 概述 本指南提供了完整的Supabase Auth角色管理和消息系统的部署、配置和使用说明。系统支持教师/学生角色管理,包含完整的权限控制、消息发送、群组管理等功能。 ## 🗂️ 文件结构 ``` h:\blews\akmon\ ├── message_system.sql # 主数据库结构 ├── supabase_auth_complete_setup.sql # 完整角色管理系统 ├── message_permissions_complete.sql # 完整权限策略 ├── open_all_message_permissions.sql # 开放权限脚本(开发/测试) ├── dev_open_permissions.sql # 快速开发权限脚本 ├── restore_normal_permissions.sql # 恢复正常权限脚本 ├── permission_manager.sql # 权限管理器 ├── deploy_one_click.sql # 一站式部署脚本 ├── supabase_message_client_complete.js # 前端客户端代码 ├── insert_test_message_data.sql # 测试数据 └── README_SUPABASE_DEPLOYMENT.md # 本指南 ``` ## 🚀 部署步骤 ### 第一步:准备Supabase项目 1. **创建Supabase项目** ```bash # 访问 https://supabase.com # 创建新项目并获取URL和密钥 ``` 2. **配置环境变量** ```javascript const supabaseUrl = 'https://your-project.supabase.co' const supabaseKey = 'your-anon-key' ``` ### 第二步:部署数据库结构 1. **执行主数据库结构** ```sql -- 在Supabase SQL编辑器中执行 -- 文件:message_system.sql ``` 2. **部署角色管理系统** ```sql -- 在Supabase SQL编辑器中执行 -- 文件:supabase_auth_complete_setup.sql ``` 3. **配置权限策略** ```sql -- 在Supabase SQL编辑器中执行 -- 文件:message_permissions_complete.sql ``` 4. **插入测试数据** ```sql -- 在Supabase SQL编辑器中执行 -- 文件:insert_test_message_data.sql ``` ### 第三步:配置Supabase Auth 1. **启用邮箱确认** ```sql -- 在Supabase Dashboard > Authentication > Settings -- 启用 "Enable email confirmations" ``` 2. **配置邮箱模板** ```html
点击下面的链接确认您的邮箱:
确认邮箱 ``` 3. **设置回调URL** ``` # 在Authentication > URL Configuration Site URL: http://localhost:3000 Additional URLs: https://yourdomain.com ``` ## 🔧 配置说明 ### 角色系统配置 系统支持三种角色: - **admin**: 管理员,拥有所有权限 - **teacher**: 教师,可以发送消息、创建群组、查看学生消息 - **student**: 学生,基础消息权限 ### 自动角色分配规则 ```sql -- 基于邮箱域名自动分配角色 CASE WHEN user_domain IN ('teacher.edu', 'faculty.edu', 'staff.edu') THEN 'teacher' WHEN user_domain IN ('admin.edu', 'management.edu') THEN 'admin' WHEN user_email LIKE '%admin%' OR user_email LIKE '%manager%' THEN 'admin' WHEN user_email LIKE '%teacher%' OR user_email LIKE '%faculty%' THEN 'teacher' ELSE 'student' END ``` ### 权限系统 每个角色的默认权限: | 权限 | Admin | Teacher | Student | |------|-------|---------|---------| | 查看所有消息 | ✅ | ❌ | ❌ | | 发送消息 | ✅ | ✅ | ✅ | | 创建群组 | ✅ | ✅ | 需权限 | | 发送广播 | ✅ | 需权限 | ❌ | | 管理角色 | ✅ | ❌ | ❌ | | 审核消息 | ✅ | 需权限 | ❌ | ## 💻 前端集成 ### 安装依赖 ```bash npm install @supabase/supabase-js ``` ### 初始化客户端 ```javascript import { messageApp } from './supabase_message_client_complete.js' // 初始化应用 await messageApp.initialize() // 用户登录 await messageApp.signIn('teacher@example.com', 'password123') // 检查用户信息 const userInfo = messageApp.getCurrentUserInfo() console.log('当前用户:', userInfo) ``` ### 常用操作示例 #### 1. 发送消息 ```javascript const messageId = await messageApp.messages.sendSecureMessage({ messageTypeId: 'announcement-type-id', receiverType: 'user', receiverId: 'student-user-id', title: '作业通知', content: '请完成本周的数学作业', metadata: { priority: 'high', dueDate: '2024-01-15' } }) ``` #### 2. 获取消息列表 ```javascript const messages = await messageApp.messages.getAccessibleMessages({ limit: 20, unreadOnly: true, messageType: 'announcement' }) ``` #### 3. 权限检查 ```javascript // 检查是否可以发送广播 const canBroadcast = await messageApp.roles.hasPermission('can_send_broadcasts') // 检查是否可以访问特定消息 const canAccess = await messageApp.roles.canAccessResource('message', messageId, 'read') ``` #### 4. 群组管理 ```javascript // 加入群组 const joinResult = await messageApp.messages.joinMessageGroup('group-id', '申请加入') // 获取用户群组 const groups = await messageApp.messages.getAccessibleGroups() ``` #### 5. 角色管理(管理员) ```javascript // 更新用户角色 await messageApp.roles.updateUserRole('user-id', 'teacher', { department: 'Mathematics', class_id: 'class-123', permissions: { can_send_broadcasts: true } }) // 批量更新角色 const updates = [ { user_id: 'user1', role: 'teacher', department: 'Science' }, { user_id: 'user2', role: 'student', class_id: 'class-456' } ] const results = await messageApp.roles.batchUpdateUserRoles(updates) ``` ## 🧪 测试和验证 ### 1. 数据库功能测试 ```sql -- 测试角色系统 SELECT * FROM public.test_message_permissions('7bf7378e-a027-473e-97ac-3460ed3f170a'); -- 查看用户角色详情 SELECT * FROM public.user_roles_detailed ORDER BY created_at DESC; -- 检查权限策略 SELECT schemaname, tablename, policyname, permissive FROM pg_policies WHERE schemaname = 'public' AND tablename LIKE 'ak_%'; ``` ### 2. 前端功能测试 ```javascript // 权限测试 await messageApp.roles.testPermissions() // 消息统计 const stats = await messageApp.messages.getMessageStats() console.log('消息统计:', stats) // 角色同步检查 const users = await messageApp.roles.getUsersWithRoles() const unsyncedUsers = users.filter(u => !u.role_synced) console.log('角色未同步的用户:', unsyncedUsers) ``` ## 🔒 安全最佳实践 ### 1. 行级安全策略(RLS) - ✅ 所有消息相关表都启用了RLS - ✅ 用户只能访问自己相关的数据 - ✅ 教师可以访问学生消息(基于班级) - ✅ 管理员拥有完全访问权限 ### 2. 权限检查 ```javascript // 始终进行权限检查 if (await messageApp.roles.hasPermission('send_message')) { // 执行发送消息操作 } else { throw new Error('没有发送消息的权限') } ``` ### 3. 输入验证 ```javascript // 验证消息内容 function validateMessage(title, content) { if (!title || title.length < 1 || title.length > 200) { throw new Error('标题长度必须在1-200字符之间') } if (!content || content.length < 1 || content.length > 5000) { throw new Error('内容长度必须在1-5000字符之间') } } ``` ## 📊 监控和维护 ### 1. 性能监控查询 ```sql -- 查看消息发送统计 SELECT DATE(created_at) as date, COUNT(*) as message_count, COUNT(DISTINCT sender_id) as active_senders FROM public.ak_messages WHERE created_at >= NOW() - INTERVAL '7 days' GROUP BY DATE(created_at) ORDER BY date DESC; -- 查看权限策略性能 SELECT schemaname, tablename, policyname, (SELECT COUNT(*) FROM pg_stat_user_tables WHERE relname = tablename) as table_size FROM pg_policies WHERE schemaname = 'public'; ``` ### 2. 数据清理 ```sql -- 清理过期消息(可选) DELETE FROM public.ak_messages WHERE created_at < NOW() - INTERVAL '1 year' AND message_type_id IN ( SELECT id FROM public.ak_message_types WHERE type_name IN ('notification', 'reminder') ); -- 清理无效角色记录 DELETE FROM public.user_roles WHERE user_id NOT IN (SELECT id FROM auth.users); ``` ## 🚨 故障排除 ### 常见问题及解决方案 #### 1. 权限策略错误 ```sql -- 检查策略冲突 SELECT tablename, COUNT(*) as policy_count FROM pg_policies WHERE schemaname = 'public' GROUP BY tablename HAVING COUNT(*) > 10; -- 重建权限策略 -- 执行 message_permissions_complete.sql ``` #### 2. 角色同步问题 ```sql -- 强制同步所有用户角色 SELECT user_id, public.sync_user_role_metadata(user_id) as synced FROM public.user_roles WHERE is_active = true; ``` #### 3. 前端认证问题 ```javascript // 检查认证状态 const { data: { session } } = await supabase.auth.getSession() if (!session) { console.log('用户未登录') // 重定向到登录页面 } // 刷新token await supabase.auth.refreshSession() ``` ## 📈 扩展功能 ### 1. 添加新角色 ```sql -- 修改角色检查约束 ALTER TABLE public.user_roles DROP CONSTRAINT user_roles_role_check; ALTER TABLE public.user_roles ADD CONSTRAINT user_roles_role_check CHECK (role IN ('admin', 'teacher', 'student', 'parent', 'supervisor')); ``` ### 2. 添加班级系统 ```sql -- 创建班级表 CREATE TABLE public.classes ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, grade TEXT, school_id UUID, teacher_id UUID REFERENCES auth.users(id), created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- 更新用户角色表 -- class_id 字段已存在,可直接使用 ``` ### 3. 消息模板系统 ```sql -- 已在主系统中实现 -- 可通过前端界面管理消息模板 SELECT * FROM public.ak_message_templates WHERE is_public = true; ``` ## 📞 支持和联系 如果在部署过程中遇到问题,请检查: 1. **Supabase项目配置**:确认URL和密钥正确 2. **数据库权限**:确认有足够的数据库权限 3. **网络连接**:确认可以连接到Supabase 4. **浏览器控制台**:查看详细错误信息 ## 📝 更新日志 ### v1.0.0 (2024-01-10) - ✅ 完整的角色管理系统 - ✅ 权限控制和RLS策略 - ✅ 前端客户端库 - ✅ 测试数据和文档 ### 未来计划 - 🔄 实时消息推送 - 📱 移动端适配 - 🎨 UI组件库 - 📊 数据分析仪表板 --- **部署完成后,请运行测试用例确保所有功能正常工作。**