
采用基于角色的访问控制(RBAC)模型,结合多租户隔离策略,通过用户-角色-权限绑定与租户ID字段实现不同角色(学生、教师、管理员)的访问控制,并支持学院/班级等租户的独立数据隔离,核心是分层管理(认证层、授权层、租户隔离层),关键组件包括用户表(含tenant_id)、角色表、权限表(资源-操作映射)、认证服务(JWT生成)、授权服务(权限验证)。
老师口吻:我们来拆解关键概念,避免空话。
多租户策略对比(表格):
| 多租户策略 | 数据库设计 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 共享数据库(租户标识) | 所有租户共享用户表,加tenant_id字段 | 简单,成本低 | 数据隔离弱,租户间数据可能混淆 | 小规模系统,租户少 |
| 独立数据库 | 每个租户有独立数据库 | 完全隔离,安全高 | 成本高,维护复杂 | 大规模系统,租户多 |
| 共享+隔离(如共享表+租户前缀) | 共享表,列加租户ID | 成本中等,隔离较好 | 部分隔离,可能存在冲突 | 中等规模系统 |
用户登录及权限验证示例(伪代码):
POST /auth/loginusername=student1, password=123, tenant_id=1sub=123, role=student, tenant_id=1, exp=...),返回token。GET /courses/1Authorization: Bearer <token>tenant_id=1(计算机学院)和role=student;user:123:permissions),获取权限(如student:courses:read);数据库表结构:
users(用户表):id, username, password_hash, tenant_id, created_at(加tenant_id索引);roles(角色表):id, role_name, description;user_roles(用户角色表):user_id, role_id;permissions(权限表):id, resource, action, role_id(加(resource, action)复合索引);role_hierarchy(角色继承表):parent_role_id, child_role_id。(约90秒)
“面试官您好,针对教育系统的用户认证和权限管理,我会设计一个基于RBAC的多租户系统。核心是分层:认证层用JWT验证身份,授权层通过用户-角色-权限绑定控制访问,租户隔离层确保学院数据隔离。具体来说,用户登录后,系统分配包含租户ID和角色的JWT,后续请求携带该token,服务器解析后检查租户和角色权限。比如学生只能查看课程,教师可布置作业,管理员可管理用户。多租户方面,采用共享数据库加租户ID字段,所有数据表(如用户表、课程表)都添加tenant_id列,查询时按tenant_id过滤。数据库表设计上,用户表包含tenant_id,权限表按资源-操作映射,并建立复合索引。缓存方面,用Redis缓存用户角色和权限,减少数据库查询。动态权限管理上,当教师创建课程后,系统实时更新权限表,并清理缓存,确保权限即时生效。这样既能满足不同角色的访问控制,又能支持多学院/班级的独立管理。”