郑州网站建设鹏之信在哪里查关键词排名
一、新增用户流程
1. 前端表单数据结构
interface UserCreateForm {email: string; // 登录邮箱phone?: string; // 手机号(可选)password: string; // 密码username: string; // 用户名real_name: string; // 真实姓名department?: string; // 部门position?: string; // 职位role_ids: string[]; // 角色ID数组
}
2. 数据流转过程
- 前端调用 Supabase Auth API
// 1. 首先创建 auth.users 表中的用户
const { data: authUser, error: authError } = await supabase.auth.admin.createUser({email: form.email,phone: form.phone,password: form.password,email_confirm: true, // 直接确认邮箱user_metadata: { // 这些数据会存储在 raw_user_meta_data 字段username: form.username,real_name: form.real_name}
})
- 触发器自动执行
-- 当 auth.users 新增数据时,触发器 handle_new_user 自动执行
-- 触发器会:
1. 在 user_profiles 表中创建用户扩展信息
2. 分配默认角色(user)
- 后续更新用户信息
-- 通过之前创建的 update_user 函数更新其他信息
SELECT public.update_user(p_user_id := auth_user.id,p_department := form.department,p_position := form.position,p_role_ids := form.role_ids
);
二、注册用户流程
1. 前端表单数据结构
interface RegisterForm {email: string; // 登录邮箱password: string; // 密码username?: string; // 用户名(可选)phone?: string; // 手机号(可选)
}
2. 数据流转过程
- 前端调用 Supabase Auth API
const { data: authUser, error: authError } = await supabase.auth.signUp({email: form.email,password: form.password,phone: form.phone,options: {data: { // 这些数据会存储在 raw_user_meta_data 字段username: form.username || form.email}}
})
- 触发器自动执行
-- 同样会触发 handle_new_user,但只会:
1. 创建基础的用户信息
2. 只分配 user 角色
三、两者的主要区别
-
权限要求
- 新增用户:需要管理员权限
- 注册用户:任何人都可以(除非关闭注册)
-
数据完整性
- 新增用户:信息更完整(部门、职位等)
- 注册用户:只有基本信息
-
角色分配
- 新增用户:可以指定多个角色
- 注册用户:只分配默认用户角色
-
邮箱验证
- 新增用户:可以直接确认邮箱
- 注册用户:通常需要邮箱验证
-
使用场景
- 新增用户:内部员工账号创建
- 注册用户:外部用户自主注册
四、数据表变化示例
新增用户时:
- auth.users 表
INSERT INTO auth.users (email, phone, encrypted_password, email_confirmed_at,raw_user_meta_data
) VALUES ('zhangsan@example.com','13800138000','[加密后的密码]',CURRENT_TIMESTAMP, -- 直接确认{"username": "zhangsan","real_name": "张三"}
);
- user_profiles 表(触发器自动)
INSERT INTO public.user_profiles (id, username, real_name, department, position
) VALUES ('[auth.users生成的uuid]','zhangsan','张三','技术部','工程师'
);
- user_roles 表(手动指定)
INSERT INTO public.user_roles (user_id, role_id) VALUES
('[user_id]', '[admin_role_id]'),
('[user_id]', '[user_role_id]');
注册用户时:
- auth.users 表
INSERT INTO auth.users (email, phone, encrypted_password,raw_user_meta_data
) VALUES ('user@example.com','13900139000','[加密后的密码]',{"username": "user@example.com"}
);
- user_profiles 表(触发器自动)
INSERT INTO public.user_profiles (id, username, real_name
) VALUES ('[auth.users生成的uuid]','user@example.com','user@example.com'
);
- user_roles 表(触发器自动)
INSERT INTO public.user_roles (user_id, role_id) VALUES
('[user_id]', '[user_role_id]'); -- 只分配用户角色
这样的设计确保了:
- 数据一致性(通过触发器)
- 权限控制(通过角色)
- 流程区分(注册vs新增)
- 安全性(密码加密、邮箱验证)