Files
akmon/README_SUPABASE_DEPLOYMENT.md
2026-01-20 08:04:15 +08:00

425 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
<!-- 自定义确认邮件模板 -->
<h2>欢迎加入消息系统</h2>
<p>点击下面的链接确认您的邮箱:</p>
<a href="{{ .ConfirmationURL }}">确认邮箱</a>
```
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组件库
- 📊 数据分析仪表板
---
**部署完成后,请运行测试用例确保所有功能正常工作。**