设计用户、角色、部门、职位和权限的系统时,需要明确它们之间的关系,并确保系统的灵活性和可扩展性_编程_山海自留地

山海自留地

设计用户、角色、部门、职位和权限的系统时,需要明确它们之间的关系,并确保系统的灵活性和可扩展性

编程
2025-06-02 14:09

1. 核心实体及其关系

  • 用户(User):系统的使用者。

  • 角色(Role):用户的权限集合,一个用户可以有多个角色。

  • 部门(Department):用户的组织归属,一个用户属于一个部门。

  • 职位(Position):用户在部门中的具体职位,一个用户可以有多个职位。

  • 权限(Permission):系统的最小功能单元,角色和职位可以关联权限。

关系图

用户 (User) —— 属于 ——> 部门 (Department)
用户 (User) —— 拥有 ——> 角色 (Role)
用户 (User) —— 担任 ——> 职位 (Position)
角色 (Role) —— 包含 ——> 权限 (Permission)
职位 (Position) —— 包含 ——> 权限 (Permission)

2. 数据库表设计

以下是基于关系型数据库的表设计示例:

用户表(users

字段名类型描述
idBIGINT用户ID(主键)
usernameVARCHAR(50)用户名
passwordVARCHAR(255)密码(加密存储)
department_idBIGINT所属部门ID(外键)
created_atDATETIME创建时间

部门表(departments

字段名类型描述
idBIGINT部门ID(主键)
nameVARCHAR(50)部门名称
parent_idBIGINT上级部门ID(外键)
created_atDATETIME创建时间

职位表(positions

字段名类型描述
idBIGINT职位ID(主键)
nameVARCHAR(50)职位名称
department_idBIGINT所属部门ID(外键)
created_atDATETIME创建时间

角色表(roles

字段名类型描述
idBIGINT角色ID(主键)
nameVARCHAR(50)角色名称
created_atDATETIME创建时间

权限表(permissions

字段名类型描述
idBIGINT权限ID(主键)
nameVARCHAR(50)权限名称
codeVARCHAR(50)权限代码(唯一)
created_atDATETIME创建时间

关联表

  • 用户-角色关联表(user_roles

    字段名类型描述
    user_idBIGINT用户ID(外键)
    role_idBIGINT角色ID(外键)
  • 用户-职位关联表(user_positions

    字段名类型描述
    user_idBIGINT用户ID(外键)
    position_idBIGINT职位ID(外键)
  • 角色-权限关联表(role_permissions

    字段名类型描述
    role_idBIGINT角色ID(外键)
    permission_idBIGINT权限ID(外键)
  • 职位-权限关联表(position_permissions

    字段名类型描述
    position_idBIGINT职位ID(外键)
    permission_idBIGINT权限ID(外键)

3. 权限校验逻辑

  • 用户权限 = 角色权限 + 职位权限

    • 用户通过角色和职位获取权限。

    • 权限校验时,合并用户的所有角色和职位权限,去重后得到最终权限列表。

      权限代码(code

      每个权限有一个唯一的 code,用于在代码中校验权限。

      例如:user:createuser: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);};

4. 扩展设计

  • 数据权限

    • 根据部门或职位限制用户访问的数据范围。

    • 例如:部门经理只能查看本部门的数据。

  • 动态权限

    • 支持动态添加角色、职位和权限。

    • 通过管理界面配置权限分配。

  • 日志与审计

    • 记录用户的权限变更和操作日志。


5. 总结

  • 用户:系统的使用者,属于部门,拥有角色和职位。

  • 角色:权限的集合,用户通过角色获取权限。

  • 职位:用户在部门中的具体职责,也可以关联权限。

  • 权限:系统的最小功能单元,通过权限代码控制访问。

  • 设计目标:灵活、可扩展、易于维护。

通过这种设计,可以实现细粒度的权限控制,并支持复杂的组织结构和业务需求。