425 lines
10 KiB
Markdown
425 lines
10 KiB
Markdown
# 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组件库
|
||
- 📊 数据分析仪表板
|
||
|
||
---
|
||
|
||
**部署完成后,请运行测试用例确保所有功能正常工作。**
|