用户(User):系统的使用者。
角色(Role):用户的权限集合,一个用户可以有多个角色。
部门(Department):用户的组织归属,一个用户属于一个部门。
职位(Position):用户在部门中的具体职位,一个用户可以有多个职位。
权限(Permission):系统的最小功能单元,角色和职位可以关联权限。
用户 (User) —— 属于 ——> 部门 (Department) 用户 (User) —— 拥有 ——> 角色 (Role) 用户 (User) —— 担任 ——> 职位 (Position) 角色 (Role) —— 包含 ——> 权限 (Permission) 职位 (Position) —— 包含 ——> 权限 (Permission)
以下是基于关系型数据库的表设计示例:
users
)字段名 | 类型 | 描述 |
---|---|---|
id | BIGINT | 用户ID(主键) |
username | VARCHAR(50) | 用户名 |
password | VARCHAR(255) | 密码(加密存储) |
department_id | BIGINT | 所属部门ID(外键) |
created_at | DATETIME | 创建时间 |
departments
)字段名 | 类型 | 描述 |
---|---|---|
id | BIGINT | 部门ID(主键) |
name | VARCHAR(50) | 部门名称 |
parent_id | BIGINT | 上级部门ID(外键) |
created_at | DATETIME | 创建时间 |
positions
)字段名 | 类型 | 描述 |
---|---|---|
id | BIGINT | 职位ID(主键) |
name | VARCHAR(50) | 职位名称 |
department_id | BIGINT | 所属部门ID(外键) |
created_at | DATETIME | 创建时间 |
roles
)字段名 | 类型 | 描述 |
---|---|---|
id | BIGINT | 角色ID(主键) |
name | VARCHAR(50) | 角色名称 |
created_at | DATETIME | 创建时间 |
permissions
)字段名 | 类型 | 描述 |
---|---|---|
id | BIGINT | 权限ID(主键) |
name | VARCHAR(50) | 权限名称 |
code | VARCHAR(50) | 权限代码(唯一) |
created_at | DATETIME | 创建时间 |
用户-角色关联表(user_roles
)
字段名 | 类型 | 描述 |
---|---|---|
user_id | BIGINT | 用户ID(外键) |
role_id | BIGINT | 角色ID(外键) |
用户-职位关联表(user_positions
)
字段名 | 类型 | 描述 |
---|---|---|
user_id | BIGINT | 用户ID(外键) |
position_id | BIGINT | 职位ID(外键) |
角色-权限关联表(role_permissions
)
字段名 | 类型 | 描述 |
---|---|---|
role_id | BIGINT | 角色ID(外键) |
permission_id | BIGINT | 权限ID(外键) |
职位-权限关联表(position_permissions
)
字段名 | 类型 | 描述 |
---|---|---|
position_id | BIGINT | 职位ID(外键) |
permission_id | BIGINT | 权限ID(外键) |
用户权限 = 角色权限 + 职位权限
用户通过角色和职位获取权限。
权限校验时,合并用户的所有角色和职位权限,去重后得到最终权限列表。
权限代码(code
)
每个权限有一个唯一的 code
,用于在代码中校验权限。
例如:user:create
、user:delete
。
示例代码
/ 获取用户的所有权限const getUserPermissions = (userId) => { const rolePermissions = getPermissionsByRoles(userId); // 通过角色获取权限 const positionPermissions = getPermissionsByPositions(userId); // 通过职位获取权限 return [...new Set([...rolePermissions, ...positionPermissions])]; // 合并并去重};// 校验用户是否有某个权限const hasPermission = (userId, permissionCode) => { const permissions = getUserPermissions(userId); return permissions.includes(permissionCode);};
数据权限:
根据部门或职位限制用户访问的数据范围。
例如:部门经理只能查看本部门的数据。
动态权限:
支持动态添加角色、职位和权限。
通过管理界面配置权限分配。
日志与审计:
记录用户的权限变更和操作日志。
用户:系统的使用者,属于部门,拥有角色和职位。
角色:权限的集合,用户通过角色获取权限。
职位:用户在部门中的具体职责,也可以关联权限。
权限:系统的最小功能单元,通过权限代码控制访问。
设计目标:灵活、可扩展、易于维护。
通过这种设计,可以实现细粒度的权限控制,并支持复杂的组织结构和业务需求。