使用Next.js构建多租户SaaS应用(后端集成方案)

本文详细讲解如何利用Next.js、Appwrite和Permit.io构建具备租户隔离与RBAC功能的教育科技SaaS平台,包含完整的后端实现方案与技术架构设计。

使用Next.js构建多租户SaaS应用(后端集成方案)

技术栈概览

技术 用途
Next.js 前端框架
Appwrite 认证与后端服务
Permit.io 细粒度权限控制
Node.js 后端运行时
Express 后端框架

系统架构设计

采用后端优先的架构模式:

后端(Node.js + Express)

  • 处理API请求与业务逻辑
  • 集成Appwrite进行用户认证与数据库管理
  • 使用Permit实现基于角色的权限控制
  • 所有数据访问请求需通过权限验证

前端(Next.js)

  • 通过安全API连接后端
  • 实现基于角色的动态UI渲染
  • 根据权限限制操作(如创建作业)

核心实现步骤

1. Permit配置

  1. 创建资源与操作(如assignments资源包含create/read操作)
  2. 定义角色体系(Admin/Teacher/Student)
  3. 在策略编辑器中配置角色-资源-操作矩阵
  4. 获取环境API密钥

2. 后端服务搭建

1
2
3
4
5
// 权限检查中间件示例
export const checkPermission = async (email: string, action: string, resource: string) => {
  const permitted = await permit.check(email, action, resource);
  return permitted;
};

3. Appwrite集成

1
2
3
4
5
6
7
8
// 数据库文档创建示例
await database.createDocument(
  DATABASE_ID,
  COLLECTION_ID,
  ID.unique(),
  data,
  [Permission.read(Role.any())]
);

关键代码实现

租户隔离实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 学生数据创建接口
router.post('/students', authMiddleware, async (req, res) => {
  const { creatorEmail } = req.body;
  
  // 权限验证
  const permitted = await checkPermission(creatorEmail, "create", "students");
  if (!permitted) return res.status(403).json({ error: 'Forbidden' });

  // 数据操作
  const student = await createStudentInDB(req.body);
  res.status(201).json(student);
});

角色同步机制

1
2
3
4
5
6
7
// 用户档案创建时同步到Permit
const permitPayload = {
  key: email,
  email,
  role_assignments: [{ role, tenant: "default" }]
};
await axios.post(PERMIT_API_URL, permitPayload, { headers });

架构优势

  1. 安全隔离:通过API层强制实施租户数据隔离
  2. 灵活扩展:可轻松添加新租户和角色类型
  3. 性能优化:权限决策由专用PDP(策略决策点)处理

下篇预告

第二部分将涵盖:

  • 前端权限绑定实现
  • 动态UI渲染策略
  • 状态管理与路由保护

完整代码示例已包含技术文档中所有关键实现片段

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计